node.js - 在 React Native + Node 之间共享代码
问题描述
我正在使用 React Native 和 Node.js。我想在两者之间共享代码。我的文件夹结构是这样的。
myreactnativeapp/
mynodeserver/
myshared/
在 react native 和 node 应用程序中,我包含了 package.json
"dpendencies" : {
"myshared": "git+https://myrepository/ugoshared.git"
}
然后可以通过 require/import 等将其包含在每个项目中。这一切都很好,对于生产我很满意。(虽然我很想知道更好的方法?)
我面临的问题是在开发中它真的很慢。
填充更改的步骤是:
- 在 Shared 中进行更改
- 提交对 git 的更改
- 更新 npm 模块
在开发中,我真的希望使用相同的代码库,而不是这个漫长的更新过程。我尝试了以下方法:
- 在 node_models/shared 中添加符号链接 - 在 react-native 包 mangaer 中不起作用
- 使用相对路径 ../../../shared - 在 react-native 包 mangaer 中不起作用
还有其他想法吗?
更新 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",
},
所以,现在是这个过程。
- 做出改变
- 启动/重启打包程序
- 自动的:
- 脚本复制 myshared/ -> myreactnativeapp/myshared/ 下的所有 .js 文件
- 脚本创建一个带有模块名称的 package.json
因为我已将 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}`)
解决方案
推荐阅读
- r - 尝试对曲线下面积 (AUC) 进行积分,错误为“match.fun(f) 中的错误:'a1$iso' 不是函数、字符或符号”
- protocol-buffers - 无法在 ami linux2 上安装 mysql_xdevapi
- python - 如何在使用 Selenium Webdriver 查找元素时正确使用 '{}'.format()
- javascript - 错误:无法在控制台中读取 null 的属性“insertAdjacentHTML”
- unix - 无法在 cron 作业的脚本中记录 netcat 输出
- angular - 如何在 Angular Guard 中使用 CombineLatest 和 Ngrx
- jinja2 - 无法使 Salt 状态下的 IF OR Jinja 逻辑工作
- android - 错误:'E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher' 使用本机反应
- r - 尝试在 JAGS 中重新定义节点编译错误
- ios - 在没有物理设备的情况下在 Xcode 中签署 iOS 应用程序