
singlespa/import-map-deployerimport-map-deployer是一个后端服务,用于更新import map JSON文件。使用该服务时,前端部署通过两步完成:
curl或httpie)修改现有import map,指向新上传的文件。这两步通常在CI流程中执行,以实现前端代码的自动化部署。该服务核心价值在于解决多CI流水线并发部署时的import map覆盖问题,避免传统"拉取-修改-重新上传"流程中的竞态条件。
!import-map-deployer演示
urlSafeList配置项,限制仅允许信任的URL前缀或自定义函数验证的URL被添加到import map。readManifest和writeManifest函数实现个性化读写逻辑。default、prod、test等不同环境的import map。import-map-deployer已发布到DockerHub,镜像名为singlespa/import-map-deployer。
dockerfileFROM singlespa/import-map-deployer:<version-tag> ENV HTTP_USERNAME=your-username HTTP_PASSWORD=your-password COPY conf.js /www/ CMD ["yarn", "start", "conf.js"]
从项目根目录运行docker-compose up,需确保当前目录存在config.json配置文件:
yamlversion: '3' services: import-map-deployer: image: singlespa/import-map-deployer:<version-tag> ports: - "5000:5000" volumes: - ./config.json:/www/config.json environment: - HTTP_USERNAME=admin - HTTP_PASSWORD=secure-password
通过npm安装并运行:
bash# 直接运行 npx import-map-deployer config.json # 自定义端口(默认5000) PORT=8080 npx import-map-deployer config.json
配置文件用于设置认证信息、存储方式、URL安全策略等,支持JSON或JavaScript格式(.json或.js)。
| 参数名 | 类型 | 说明 |
|---|---|---|
urlSafeList | array | 信任的URL前缀列表或验证函数,未配置则允许所有URL(不推荐) |
username | string | HTTP基本认证用户名 |
password | string | HTTP基本认证密码 |
manifestFormat | string | 必须,取值"importmap"或"sofe",指定import map格式 |
locations | object | 必须,定义各环境的import map存储位置,键为环境名,值为存储路径(如s3://bucket/import-map.json) |
packagesViaTrailingSlashes | boolean | 是否自动生成带尾随斜杠的包记录,默认true |
cacheControl | string | 导入映射文件的缓存控制头,默认"public, must-revalidate, max-age=0" |
json{ "urlSafeList": ["[***]", "[***]"], "username": "admin", "password": "secure-pass", "manifestFormat": "importmap", "locations": { "default": "s3://my-default-bucket/import-map.json", "prod": "s3://my-prod-bucket/import-map.json", "test": "file://./test-import-map.json" }, "s3Endpoint": "[***]", "cacheControl": "public, max-age=300" }
javascriptmodule.exports = { urlSafeList: [ "[***]", (url) => url.hostname.endsWith(".trusted-domain.com") ], username: "admin", password: process.env.IMD_PASSWORD, manifestFormat: "importmap", locations: { "custom-env": "custom://path" }, // 自定义读取函数 readManifest: async (env) => { const response = await fetch(`[***]{env}/import-map.json`); return response.text(); }, // 自定义写入函数 writeManifest: async (importMapStr, env) => { await fetch(`[***]{env}/import-map.json`, { method: "PUT", body: importMapStr }); return JSON.parse(importMapStr); } };
通过s3://前缀指定S3存储路径,格式为s3://bucket-name/file.json。依赖AWS CLI环境变量(如AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY)进行认证。
配置示例:
json{ "manifestFormat": "importmap", "locations": { "prod": "s3://my-cdn-bucket/import-map.json" }, "s3": { "putObject": { "ACL": "public-read" } } }
通过spaces://前缀指定,格式为spaces://bucket-name.region.digitaloceanspaces.com/file.json。需配置s3Endpoint指向Spaces区域端点。
配置示例:
json{ "manifestFormat": "importmap", "s3Endpoint": "[***]", "locations": { "staging": "spaces://my-spaces-bucket.nyc3.digitaloceanspaces.com/import-map.json" } }
通过对象形式配置,需设置azureContainer、azureBlob,认证通过环境变量AZURE_STORAGE_CONNECTION_STRING或配置中的azureConnectionString。
配置示例:
javascriptmodule.exports = { manifestFormat: "importmap", locations: { "azure-env": { azureContainer: "my-container", azureBlob: "import-map.json", azureConnectionString: process.env.AZURE_CONN_STR } } };
通过gs://前缀指定,格式为gs://bucket-name/file.json。需设置环境变量GOOGLE_APPLICATION_CREDENTIALS指向密钥文件。
配置示例:
json{ "manifestFormat": "importmap", "locations": { "gcs-env": "gs://my-gcs-bucket/import-map.json" } }
直接指定本地文件路径,如./prod-import-map.json。
配置示例:
json{ "manifestFormat": "importmap", "locations": { "local": "./local-import-map.json" } }
示例(curl):
bashcurl -u admin:secure-pass localhost:5000/environments
响应:
json{ "environments": [ { "name": "default", "aliases": [], "isDefault": true }, { "name": "prod", "aliases": [], "isDefault": false } ] }
示例:
bashcurl -u admin:secure-pass "localhost:5000/import-map.json?env=prod"
示例(HTTPie):
bashhttp -a admin:secure-pass PATCH :5000/import-map.json?env=prod < new-import-map.json
请求体:
json{ "service": "my-app", "url": "[***]" }
示例(curl):
bashcurl -u admin:secure-pass -X PATCH -H "Content-Type: application/json" -d '{"service":"my-app","url":"[***]"}' "localhost:5000/services?env=stage"
示例(含特殊字符,需URI编码):
bash# 删除服务"@company/my-app"(编码后为"%40company%2Fmy-app") curl -u admin:secure-pass -X DELETE "localhost:5000/services/%40company%2Fmy-app?env=alpha"
username和password启用HTTP基本认证,且凭证仅CI runner知晓。urlSafeList限制信任的URL前缀,防止***URL注入。


manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务