重写覆盖依赖文件

为什么用?

通过修复文件的方式对依赖包里的代码进行修复,甚至补充或定制符合自身项目需求的功能.

如何实施?

  1. 在项目更目录创建 rewrite_node_modules 文件夹,与 node_modules 同级,
  2. 在 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('
                
                                 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐