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注入。探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
在 Linux 系统配置镜像服务
在 Docker Desktop 配置镜像
Docker Compose 项目配置
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
MacOS OrbStack 容器配置
在宝塔面板一键配置镜像
Synology 群晖 NAS 配置
飞牛 fnOS 系统配置镜像
极空间 NAS 系统配置服务
爱快 iKuai 路由系统配置
绿联 NAS 系统配置镜像
QNAP 威联通 NAS 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
无需登录使用专属域名
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
免费版仅支持 Docker Hub 访问,不承诺可用性和速度;专业版支持更多镜像源,保证可用性和稳定速度,提供优先客服响应。
专业版支持 docker.io、gcr.io、ghcr.io、registry.k8s.io、nvcr.io、quay.io、mcr.microsoft.com、docker.elastic.co 等;免费版仅支持 docker.io。
当返回 402 Payment Required 错误时,表示流量已耗尽,需要充值流量包以恢复服务。
通常由 Docker 版本过低导致,需要升级到 20.x 或更高版本以支持 V2 协议。
先检查 Docker 版本,版本过低则升级;版本正常则验证镜像信息是否正确。
使用 docker tag 命令为镜像打上新标签,去掉域名前缀,使镜像名称更简洁。
来自真实用户的反馈,见证轩辕镜像的优质服务