如何替换package.json脚本中已废弃的cpx包并解决相关报错
原脚本作用
你当前的scripts是基于已停止维护的cpx工具实现依赖包静态资源复制,具体逻辑如下:
dist命令:并行执行两个复制操作,把所有node_modules子目录下dist文件夹里的一级文件、所有嵌套层级的文件,全部复制到项目的Content/lib目录下,--v参数会在控制台输出所有复制操作的日志media命令:和dist逻辑一致,只是复制的是所有node_modules子目录下media文件夹的所有文件build命令:串行执行dist和media命令,完成所有静态资源的批量复制
报错原因
你替换为cpx2后出现的TypeError: Cannot read property 'name' of undefined报错,是由于cpx2依赖的高版本universalify包和你当前项目使用的低版本Node.js(一般是Node.js 8.x及更低版本)不兼容导致的,高版本universalify用到了旧版Node不支持的语法特性。
重构方案
你可以根据项目情况选以下任意一种方案重构:
方案1:最小改动修复兼容问题
锁定安装兼容旧版Node的cpx2及相关依赖版本,无需修改原有scripts逻辑:
- 执行安装命令:
npm install cpx2@3.0.2 universalify@0.1.2 --save-dev - 直接执行原有
npm run build即可正常运行。
方案2:替换为维护更活跃的cpy-cli(语法接近cpx,改动量小)
cpy-cli是目前仍在活跃维护的同类文件复制工具,glob语法和cpx基本一致,且不需要写两条命令匹配一级和嵌套文件:
- 执行安装命令:
npm install cpy-cli --save-dev - 修改package.json的scripts配置为:
"scripts": { "dist": "cpy node_modules/**/dist/**/*.* Content/lib", "media": "cpy node_modules/**/media/**/*.* Content/lib", "build": "npm run dist && npm run media" }
方案3:自定义脚本实现(长期维护更灵活,无第三方工具依赖风险)
如果不想依赖第三方CLI工具,可以自己写小脚本实现复制逻辑,后续调整规则也更方便:
- 先安装所需依赖:
npm install fs-extra glob --save-dev - 在项目根目录新建
copy-assets.js文件,内容如下:
const fs = require('fs-extra') const glob = require('glob') async function runCopy() { // 复制dist目录所有文件 const distFiles = glob.sync('node_modules/**/dist/**/*.*', { nodir: true }) for (const filePath of distFiles) { const targetPath = filePath.replace(/^node_modules\/[^/]+\/dist\//, 'Content/lib/') await fs.copy(filePath, targetPath) console.log(`复制完成:${filePath} => ${targetPath}`) } // 复制media目录所有文件 const mediaFiles = glob.sync('node_modules/**/media/**/*.*', { nodir: true }) for (const filePath of mediaFiles) { const targetPath = filePath.replace(/^node_modules\/[^/]+\/media\//, 'Content/lib/') await fs.copy(filePath, targetPath) console.log(`复制完成:${filePath} => ${targetPath}`) } } runCopy().catch(err => { console.error('资源复制失败:', err) process.exit(1) })
- 修改package.json的scripts配置为:
"scripts": { "build": "node copy-assets.js" }
内容的提问来源于stack exchange,提问作者disap
相关产品推荐
相关产品推荐

