在React Native + Node

时间:2018-06-22 18:07:06

标签: node.js react-native npm yarnpkg

我正在使用React Native和Node.js。我想在两者之间共享代码。我的文件夹结构是这样。

myreactnativeapp/
mynodeserver/
myshared/

在react native和node应用中,我包括了 package.json

"dpendencies" : {
    "myshared": "git+https://myrepository/ugoshared.git"
}

然后可以通过需求/导入等将其包含在每个项目中。这一切都很好,对于生产我很满意。 (尽管我想知道更好的方法吗?)

我面临的问题是开发中,这确实很慢。

要进行更改的步骤是:

  1. 进行共享更改
  2. 将更改提交到git
  3. 更新npm模块

在开发中,我确实希望使用相同的代码库,而不是使用冗长的更新过程。我尝试了以下方法:

  1. 在node_models / shared中添加一个符号链接-在react-native软件包mangaer中不起作用
  2. 使用相对路径../../../shared-在react-native软件包管理器中不起作用

还有其他想法吗?

更新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",
  },

现在,过程到此。

  1. 进行更改
  2. 启动/重置打包程序
  3. 自动:
    • 脚本将所有共享的.js文件复制到myshared /-> myreactnativeapp / myshared /
    • 脚本使用模块名称创建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}`)

0 个答案:

没有答案