• 重写覆盖node_modules中的依赖文件


    为什么用?

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

    如何实施?

    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(' 以上的文件已被rewrite_node_modules中的文件替换,升级版本后请注意检查!!!'))

    有什么特性?

    1. 同名文件会替换,如果new_node_modules中有而node_modules中没有的文件为新增。
    2. 同名文件的替换是整个文件的复制替换,不是文件内代码的局部替换。
    推荐参考:https://blog.csdn.net/xxitcef/article/details/117378817

    方案二:

    使用patch-package修改Node.js依赖包内容



  • 相关阅读:
    hash
    C#执行Sql事务处理
    数据库的锁表
    页面的刷新 和图片的替换
    单点登录 Webservice
    js 动态调用js文件
    .net生成EXCEL
    JS : 连续滚动
    引用指定类型的对象
    对象序列化为字符串
  • 原文地址:https://www.cnblogs.com/wxyblog/p/16283533.html
Copyright © 2020-2023  润新知