为什么用?
通过修复文件的方式对依赖包里的代码进行修复,甚至补充或定制符合自身项目需求的功能.
如何实施?
- 在项目更目录创建 rewrite_node_modules 文件夹,与 node_modules 同级,
- 在 package.json 文件中的 scripts 中加入 patchFiles 命令,并将此命令配置在各个执行命令之前
举例:
"scripts": { "dev": "npm run patchFiles && node --max_old_space_size=4096 node_modules/@vue/cli-service/bin/vue-cli-service.js serve", "stage": "npm run patchFiles && node --max_old_space_size=4096 node_modules/@vue/cli-service/bin/vue-cli-service.js --mode stage", "build": "npm run patchFiles && node --max_old_space_size=4096 node_modules/@vue/cli-service/bin/vue-cli-service.js build", "build:report": "vue-cli-service build --report", "build:stage": "npm run patchFiles && node --max_old_space_size=4096 node_modules/@vue/cli-service/bin/vue-cli-service.js build --mode stage", "build:preview": "npm run patchFiles && node --max_old_space_size=4096 node_modules/@vue/cli-service/bin/vue-cli-service.js build --mode preview", "preview": "serve -s dist", "lint": "vue-cli-service lint", "postinstall": "npx patch-package", "patchFiles": "node ./src/utils/patchFiles.js" },
3.添加文件
./src/utils/patchFiles.js
const fs = require('fs') const path = require('path') const chalk = require('chalk') // 解决 node_modules 修改源码,导致重新装包而要手动替换源码的重复操作。 // 将 new_node_modules 内的文件 覆盖 真正的 node_modules const REAL_NODE_MODULES = path.resolve('./node_modules') // 旧node_modules const MY_NODE_MODULES = path.resolve('new_node_modules') // 新node_modules copy(MY_NODE_MODULES, REAL_NODE_MODULES) /** *复制目录中的所有文件包括子目录 *@param{string}需要复制的目录、文件 *@param{string}复制到指定的目录、文件 *@param{function}每次复制前,都会经过一次filterFn,若返回true,则复制。 */ function copy(origin, target, filterFn = () => true) { if (fs.statSync(origin).isDirectory()) { // 来源是个文件夹,那目标也整一个文件夹 if (!fs.existsSync(target)) { fs.mkdirSync(target) } fs.readdirSync(origin).forEach(originName => { const originFilePath = path.resolve(origin, originName) const targetFilePath = path.resolve(target, originName) copy(originFilePath, targetFilePath, filterFn) }) } else if (filterFn(origin, target)) { console.info(chalk.blue('已被覆盖的文件:', target)) fs.copyFileSync(origin, target) } } console.info(chalk.bold.yellow(' 以上的文件已被rewrite_node_modules中的文件替换,升级版本后请注意检查!!!'))
有什么特性?
- 同名文件会替换,如果new_node_modules中有而node_modules中没有的文件为新增。
- 同名文件的替换是整个文件的复制替换,不是文件内代码的局部替换。
推荐参考:https://blog.csdn.net/xxitcef/article/details/117378817
方案二:
使用patch-package修改Node.js依赖包内容