Я использую React Native и Node.js. Я хочу поделиться кодом между ними. Моя структура папок такова.
myreactnativeapp/
mynodeserver/
myshared/
В приложениях React Native и Node я включил package.json.
"dpendencies" : {
"myshared": "git+https://myrepository/ugoshared.git"
}
Затем это можно включить в каждый проект через require/import и т. д. Все это отлично работает, и для производства я доволен этим. (Хотя я хотел бы знать лучший способ?)
Проблема, с которой я сталкиваюсь, заключается в том, что в разработке она очень медленная.
Шаги для внесения изменений:
- Внесите изменения в общий доступ
- Зафиксировать изменения в git
- Обновите модуль npm
В разработке я действительно хочу, чтобы использовалась одна и та же кодовая база, а не этот длительный процесс обновления. Я пробовал следующее:
- Добавление символической ссылки в node_models/shared — не работает в менеджере пакетов, ориентированном на реакцию.
- Использование относительных путей ../../../shared - не работает в менеджере пакетов с реактивным управлением
Любые другие идеи?
Обновление 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",
},
Итак, процесс сейчас.
- Изменить
- Запустить/перезапустить упаковщик
- Automatic:
- Script copies all .js files under myshared/ -> myreactnativeapp/myshared/
- Скрипт создает package.json с именем модуля
Поскольку я добавил package.json в скопированные файлы с именем модуля, в моем проекте я могу просто включить элементы так же, как если бы модуль был включен через менеджер пакетов выше. Теоретически, когда я перейду на использование пакета в продакшене, мне не придется ничего менять.
Import MyModule from 'myshared/MyModule'
Обновление 2
Моя первая идея стала утомительной, постоянно перезапуская менеджер пакетов. Вместо этого я создал небольшой скрипт узла в общем каталоге, чтобы следить за изменениями. Всякий раз, когда происходит изменение, он копирует его в родной рабочий каталог реакции.
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}`)