Ao desenvolver um projeto, quando a configuração padrão em node_modules não atende aos requisitos atuais do projeto, é necessário modificar o código-fonte correspondente em node_modules. No entanto, se você operar diretamente o código-fonte para modificação manual, o código não será sincronizado com o warehouse.Quando outras pessoas extraem o código para desenvolvimento ou após executar a instalação do npm, o código-fonte ainda é a configuração padrão. Neste momento, você pode operar o código-fonte por meio de nodejs, que pode atender às necessidades atuais.
Etapa 1: crie um diretório de arquivos para armazenar conteúdo modificado
Crie uma pasta change_modules para armazenar o conteúdo do arquivo modificado, mas o diretório do arquivo modificado precisa ser consistente com o diretório do arquivo modificado em node_modules . Por exemplo, o diretório onde o arquivo modificado xmllint.js está localizado é: node_modules/@wepy/cli/core/util/xmllint.js, então o diretório do arquivo recém-criado deve ser: change_modules/@wepy/cli/core/util /xmllint.js, conforme mostrado na imagem
Etapa 2: modifique o conteúdo
Basta colar todo o conteúdo do arquivo modificado no diretório correspondente em change_modules e modificar os locais que precisam ser alterados.
Terceiro Passo: Copiar | Substituir
Crie um novo arquivo change_modules.js, que armazena a sintaxe relevante para substituição de arquivo
const fs = require('fs')
const path = require('path')
// 将 change_modules 内的文件覆盖在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}需要复制的目录、文件
*@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)) {
//执行替换
fs.copyFileSync(origin, target)
}
}
Etapa 4: modificar package.json
Adicione a sintaxe para executar change_modules.js em package.json, para que a execução de change_modules.js substitua o arquivo correspondente antes da execução do projeto, conforme mostrado na figura:
Após realizar as operações acima, execute o projeto e pronto!
Detalhes de sintaxe do nodejs relacionados
require('fs') : O módulo fs é um dos módulos principais do nodejs, que lida principalmente com operações como leitura e gravação, cópia, exclusão e renomeação de arquivos. Quando precisar usar este módulo, você precisará importar este arquivo primeiro.
path.resolve(): Este método resolve um caminho/segmento de caminho em um caminho absoluto.
fs.statsync(path): Receba uma variável de caminho para obter informações detalhadas do caminho.
isDirectory(): Determine se é um diretório, o diretório retorna verdadeiro e o arquivo retorna falso.
fs.existsSync(path): verifica se o caminho especificado existe.
fs.mkdirSync(path): usado para criar um diretório.
fs.readdirSpath(path): Obtenha todos os nomes de arquivos no diretório especificado.
fs.copyFileSpath(beforePath,newPath): usado para copiar arquivos de forma síncrona do caminho de origem para o caminho de destino.