在開發(fā)項(xiàng)目時(shí),當(dāng)node_modules中的默認(rèn)配置不滿足當(dāng)前項(xiàng)目需求時(shí),就需要對node_modules中相應(yīng)的源碼進(jìn)行修改。但如果直接操作源碼進(jìn)行手動(dòng)修改,代碼不會同步到倉庫中,當(dāng)其他人拉取代碼進(jìn)行開發(fā)時(shí),或者執(zhí)行了npm install后源碼依舊是默認(rèn)配置。而此時(shí)則可以通過nodejs對源碼進(jìn)行操作,可以滿足當(dāng)前需求。
第一步:創(chuàng)建用來存放修改后內(nèi)容的文件目錄
創(chuàng)建文件夾change_modules,用來存放修改后的文件內(nèi)容,但修改后的文件目錄需要和node_modules中被修改的文件目錄一致。例如被修改的文件xmllint.js所在目錄是:node_modules/@wepy/cli/core/util/xmllint.js,則新建的文件目錄應(yīng)當(dāng)為:change_modules/@wepy/cli/core/util/xmllint.js,如圖
第二步:修改內(nèi)容
只需將被修改的文件中的所有內(nèi)容粘貼到change_modules中對應(yīng)的目錄中,然后對需要更改的地方進(jìn)行修改。
第三步:執(zhí)行復(fù)制 | 替換
新建change_modules.js文件,此文件中存放的是文件替換的相關(guān)語法
const fs = require('fs')
const path = require('path')
// 將 change_modules 內(nèi)的文件覆蓋在node_modules中
const REAL_NODE_MODULES = path.resolve('./node_modules') // 舊node_modules
const MY_NODE_MODULES = path.resolve('./change_modules') // 新node_modules
copy(MY_NODE_MODULES, REAL_NODE_MODULES)
/**
*@param{string}需要復(fù)制的目錄、文件
*@param{string}復(fù)制到指定的目錄、文件
*@param{function}每次復(fù)制前,都會經(jīng)過一次filterFn,若返回true,則復(fù)制。
*/
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)) {
//執(zhí)行替換
fs.copyFileSync(origin, target)
}
}
第四步:修改package.json
在package.json中添加執(zhí)行change_modules.js的語法,使得項(xiàng)目運(yùn)行前執(zhí)行change_modules.js替換相應(yīng)文件,如圖:?
執(zhí)行以上操作后,運(yùn)行項(xiàng)目則大功告成!
相關(guān)nodejs語法詳解
require('fs') :fs模塊為nodejs的核心模塊之一,主要處理文件的讀寫、復(fù)制、刪除、重命名等操作。當(dāng)需要使用該模塊時(shí),需要先導(dǎo)入該文件。
path.resolve():?該方法將路徑/路徑段解析為絕對路徑。
fs.statsync(path):接收一個(gè)path變量,可獲取到路徑的詳細(xì)信息。
isDirectory():判斷是否是目錄,目錄返回true,文件返回false。
fs.existsSync(path):檢測指定路徑是否存在。
fs.mkdirSync(path):用于創(chuàng)建目錄。
fs.readdirSpath(path):獲取指定目錄下所有文件名稱。文章來源:http://www.zghlxwxcb.cn/news/detail-448070.html
fs.copyFileSpath(beforePath,newPath):用于將文件從源路徑同步復(fù)制到目標(biāo)路徑。文章來源地址http://www.zghlxwxcb.cn/news/detail-448070.html
到了這里,關(guān)于通過nodejs修改node_modules中的源碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!