我正在使用React Native和Node.js。我想在两者之间共享代码。我的文件夹结构是这样。
myreactnativeapp/
mynodeserver/
myshared/
在react native和node应用中,我包括了 package.json
"dpendencies" : {
"myshared": "git+https://myrepository/ugoshared.git"
}
然后可以通过需求/导入等将其包含在每个项目中。这一切都很好,对于生产我很满意。 (尽管我想知道更好的方法吗?)
我面临的问题是开发中,这确实很慢。
要进行更改的步骤是:
在开发中,我确实希望使用相同的代码库,而不是使用冗长的更新过程。我尝试了以下方法:
还有其他想法吗?
更新1
我创建了一个script.sh,它将在程序包管理器启动之前运行以将文件复制到本地目录中。这不是理想的方法,但至少我只需要重新启动打包程序即可,而不必与git等混为一谈。
#myreactnativeapp/start.sh
SOURCE=../myshared
MODULE=myshared
rm -rf ./$MODULE
mkdir ./$MODULE
find $SOURCE -maxdepth 1 -name \*.js -exec cp -v {} "./$MODULE/" \;
# create the package.json
echo '{ "name": "'$MODULE'" }' > ./$MODULE/package.json
# start the packager
node node_modules/react-native/local-cli/cli.js start
然后在我的package.json中,将脚本更新为
"scripts": {
"start": "./start.sh",
},
现在,过程到此。
因为我已经使用模块名称将package.json添加到复制的文件中,所以在我的项目中,我可以仅包含与通过上面的包管理器包含该模块相同的项目。从理论上讲,当我转为在生产中使用该软件包时,我将无需进行任何更改。
Import MyModule from 'myshared/MyModule'
更新2
我的第一个想法很累,总是重新启动软件包管理器。相反,我在共享目录中创建了一个小节点脚本来监视更改。每当有更改时,它都会将其复制到react本机工作目录。
var watch = require('node-watch')
var fs = require('fs')
var path = require('path')
let targetPath = '../reactnativeapp/myshared/'
watch('.', { recursive: false, filter: /\.js$/ }, function(evt, name) {
console.log('File changed: '+name+path.basename(__filename))
// don't copy this file
if(path.basename(__filename) === name) {
return
}
console.log(`Copying file: ${name} --> ${targetPath+name}`);
fs.copyFile(name, targetPath+name, err => {
if(err) {
console.log('Error:', err)
return;
}
console.log('Success');
})
});
console.log(`Starting to watch: ${__dirname}. All files to be copied to: ${targetPath}`)