react-native 修改完源码后,如何让其他同事直接能用,每次都发过去修改的node源文件肯定是不方便的,这里分享个脚本
其实我们需要达成的目的是修改NodaModule l的源码其他人也在,但是NodaModule 文件肯定是忽略的,所以我们的思路是新建一个文件,然后按照你NodaModule 修改的文件路径拷贝到新文件(重点 路径名完全一样 )我这新建的文件名字是const_modules,const_modules不被git 忽略
然后我们写个脚本文件init文件。每次执行之后都会按照const_modules里面的文件全部 复制替换到NodaModule这样就完成了所有操作
init文件代码
var fs = require('fs');//引用文件系统模块
var copy = require('./copy');
/**
* 生成清单
*/
function gennerateResource(fileName) {
try {
var notice = `\n//!!!!!代码自动生成,请勿手动修改!!!!!\n`;
var content = `\n/**\n* @author liuchengfei E-mail:13717883106@163.com\n* @Description 资源清单\n*/\n`;
var images = `export const Image={\n${listImages("./app/resources/imgs")}\n};`;
var colors = `export const Color={\n${listColors("./app/resources/colors")}\n};`;
content = `${content}
\n${notice}\n${listCommonAPI()}
\n${notice}\n${images}
\n${notice}\n${colors}`;
fs.writeFileSync(fileName, content);
} catch (error) {
console.error('!!!!!!!!!!!!!!!!!!文件格式不正确,请检查!!!!!!!!!!!!!!!!!!!!' + error)
}
}
function listCommonAPI() {
var stringFunc = `\nexport function getString(funcStr:string){`
.concat(`\n`)
.concat(`\ttry{`)
.concat(`\n\treturn eval("String."+funcStr+"()");}`)
.concat(`\n\tcatch(error){}`)
.concat(`\n\treturn '';`)
.concat(`\n}`);
var imageFunc = `\nexport function getImage(funcStr:string){`
.concat(`\n`)
.concat(`\ttry{`)
.concat(`\n\treturn eval("Image."+funcStr+"()");}`)
.concat(`\n\tcatch(error){}`)
.concat(`\n\treturn 0;`)
.concat(`\n}`);
return stringFunc.concat(imageFunc);
}
/**
* 列出图片清单
* @param dirPath
* @param fileName
* @returns {string}
*/
function listImages(dirPath) {
var content = ``;
var files = fs.readdirSync(dirPath);
files.forEach(function (itm, index) {
if (itm.endsWith('.png') && !(itm.includes('@2x') || itm.includes('@3x'))) {
content = `${content}\t${itm.replace('.png', '')}:()=>require('${dirPath}/${itm}'),\n`;
} else if (itm.endsWith('.gif') && !(itm.includes('@2x') || itm.includes('@3x'))) {
content = `${content}\t${itm.replace('.gif', '')}:()=>require('${dirPath}/${itm}'),\n`;
} else if(itm.endsWith('.jpeg') && !(itm.includes('@2x') || itm.includes('@3x'))){
content = `${content}\t${itm.replace('.jpeg', '')}:()=>require('${dirPath}/${itm}'),\n`;
} else if(itm.endsWith('.jpg') && !(itm.includes('@2x') || itm.includes('@3x'))){
content = `${content}\t${itm.replace('.jpg', '')}:()=>require('${dirPath}/${itm}'),\n`;
}
});
return content;
}
/**
* 列出所有的颜色
* 1个目录对应多个color.json文件
* 1.需要解决声明重复问题
* 2.需要不同的命名空间
* @param dirPath
*/
function listColors(dirPath) {
let colorResource = '';
var files = fs.readdirSync(dirPath);
files.forEach(function (itm, index) {
if (itm.endsWith('.json')) {
var data = fs.readFileSync(`${dirPath}/${itm}`);
let jsonObj = JSON.parse(data.toString());
Object.keys(jsonObj).map((key) => {
colorResource = `${colorResource}\t${key}:()=>"${jsonObj[key]}",\n`
});
} else {
throw new Error('you must rename filename endwith .json')
}
});
if (colorResource) {
colorResource = colorResource.substring(0, colorResource.lastIndexOf(','));
}
//console.log(`colorResource:\n` + colorResource);
return colorResource;
}
function watch(dirStr) {
var stat = fs.statSync(dirStr)
if (stat.isDirectory()) {
return fs.watchFile(
dirStr,
{
persistent: true,
interval: 100,
recursive: true,
}, (currStat) => {
console.log("文件被修改,重新生成!");
gennerateResource('Resource.ts');
});
}
return null;
}
//小心勿动
gennerateResource('Resource.ts');
let watchers = [];
for (let watcher of watchers) {
if (watcher) {
watcher.unwatch();
}
}
function fsExistsSync(path) {
try{
fs.accessSync(path,fs.F_OK);
}catch(e){
return false;
}
return true;
}
function rmdir(dirStr) {
let files = [];
if(fs.existsSync(dirStr)){
files = fs.readdirSync(dirStr);
files.forEach((file, index) => {
let curPath = dirStr + "/" + file;
if(fs.statSync(curPath).isDirectory()){
rmdir(curPath); //递归删除文件夹
} else {
fs.unlinkSync(curPath); //删除文件
}
});
fs.rmdirSync(dirStr);
console.log('删除目录成功');
}
}
rmdir('node_modules/react-native-af-video-player/node_modules');// 需要删除的文件源目录react-native-af-video-player 下 重复的react-native-video 文件依赖
copy里面的代码
var fs = require('fs');
//以下为拷贝文件夹操作
var copy = function(src, dst) {
let paths = fs.readdirSync(src); //同步读取当前目录
paths.forEach(function(path) {
var _src = src + '/' + path;
var _dst = dst + '/' + path;
if (fs.statSync(_src).isFile()) {
let readable = fs.createReadStream(_src); //创建读取流
let writable = fs.createWriteStream(_dst); //创建写入流
readable.pipe(writable);
} else {
checkDirectory(_src, _dst, copy);
}
});
};
function fsExistsSync(path) {
try {
fs.accessSync(path, fs.F_OK);
} catch (e) {
return false;
}
return true;
}
var checkDirectory = function(src, dst, callback) {
if (fsExistsSync(dst)) {
callback(src, dst);
} else {
fs.mkdirSync(dst);
callback(src, dst);
}
};
function loopCopy(src, dest) {
console.log('from:', src);
checkDirectory(src, dest, copy);
console.log('===>', dest);
}
loopCopy('./const_modules', './node_modules/');
这里的代码是包含图片和颜色都替换,然后统一生成一个 Resource文件。之后项目所有用到颜色 和图片的地方都可以用,用法:
import * as Resource from '../../../Resource';
color: Resource.Color.common_black_0e()
<Image style={{width: iconSize, height: iconSize}} source={Resource.Image.home_card_no_open()}/>