离线RHEL 8.6系统创建Svelte项目/安装Node.js包遇FETCH_ERROR
问题分析
出现Unexpected token <错误,本质是Nginx返回了HTML页面(比如404或默认索引页),而非npm仓库要求的JSON元数据。npm仓库不是简单放置tgz包即可,必须符合特定的目录结构和元数据规范。
解决步骤
1. 构建符合npm规范的离线仓库结构
不要手动复制tgz包,需按npm仓库要求创建目录和元数据文件:
- 针对单个包(比如
create-svelte@4.2.1):- 创建目录
nodejs/create-svelte/4.2.1/,将下载好的create-svelte-4.2.1.tgz放入其中; - 在
create-svelte/目录下创建index.json,内容示例:
{ "name": "create-svelte", "versions": { "4.2.1": "http://myrepo.../nodejs/create-svelte/4.2.1/create-svelte-4.2.1.tgz" }, "dist-tags": { "latest": "4.2.1" } } - 创建目录
- 针对Scope包(比如
@smui/button):
需创建nodejs/@smui/button/目录,后续版本目录和index.json的创建逻辑同上,注意目录名保留@smui前缀。
2. 配置Nginx返回正确的内容类型
修改Nginx配置,确保请求仓库路径时返回JSON而非HTML:
location /nodejs { root /path/to/your/repo/filesystem; autoindex off; default_type application/json; # 为tgz包设置正确的MIME类型 location ~* \.tgz$ { default_type application/gzip; } }
配置后重启Nginx,用curl http://myrepo.../nodejs/create-svelte/测试,确认返回的是JSON内容而非HTML。
3. 批量生成仓库结构(可选)
若需要处理大量包,可在联网机器上用脚本批量生成:
#!/bin/bash REPO_DIR="/path/to/local/repo/nodejs" # 替换为你需要的包列表 PACKAGES=("create-svelte@latest" "@smui/button@latest") REPO_URL="http://myrepo.../nodejs" for pkg in "${PACKAGES[@]}"; do PKG_NAME=$(echo $pkg | cut -d'@' -f1) PKG_VERSION=$(echo $pkg | cut -d'@' -f2) if [ "$PKG_VERSION" = "latest" ]; then PKG_VERSION=$(npm view $pkg version) fi # 创建版本目录 PKG_DIR="$REPO_DIR/$PKG_NAME/$PKG_VERSION" mkdir -p "$PKG_DIR" # 下载tar包 TARBALL_URL=$(npm view $pkg@$PKG_VERSION dist.tarball) curl -o "$PKG_DIR/$(basename $TARBALL_URL)" "$TARBALL_URL" # 生成包的index.json cat > "$REPO_DIR/$PKG_NAME/index.json" <<EOF { "name": "$PKG_NAME", "versions": { "$PKG_VERSION": "$REPO_URL/$PKG_NAME/$PKG_VERSION/$(basename $TARBALL_URL)" }, "dist-tags": { "latest": "$PKG_VERSION" } } EOF done
执行脚本后,将生成的nodejs目录同步到离线环境的Nginx文件系统中。
4. 重新执行npm命令
确认仓库结构和Nginx配置正确后,重新运行:
npm create svelte@latest test_project --registry http://myrepo.../nodejs npm install --save-dev @smui/button --registry http://myrepo.../nodejs
内容的提问来源于stack exchange,提问作者Benoit
相关产品推荐
相关产品推荐

