Monorepo에서 React Native와 웹 프로젝트 간의 공유 패키지.
7928 단어 reactnativemonorepoexporeact
core
웹 프로젝트와 React
모바일 프로젝트 간에 npmReact Native
패키지를 연결하는 방법은 무엇입니까?이 기사에서는 실을 패키지 관리자로 사용하겠습니다.
pnpm
또는 심지어 npm
로 이 작업을 수행할 수 있지만 테스트하지는 않았습니다.로컬에서 패키지를 공유하는 이유는 무엇입니까?
많은 하위 프로젝트를 포함하는 프로젝트를 작업할 때 API와 프런트 또는 모바일 간에 코드를 공유하고 싶을 것입니다.
코드 중복을 최소화하기 위한 첫 번째 솔루션은 예를 들어 core
라는 추가 패키지를 만들어 각 프로젝트 간에 공유 종속성으로 로컬에서 공유하는 것입니다.
모든 프로젝트는 package.json
파일에 이 종속성을 포함합니다.
"dependencies": {
"core": "*"
}
단점은 핵심 패키지를 게시하여 설치해야 하고 로컬 개발 및 CI 논리가 훨씬 복잡하다는 것입니다.
원사 링크
이 문제를 해결하는 간단한 해결책은 yarn link
를 사용하여 패키지 사이에 로컬로 심볼릭 링크를 만드는 것입니다.
cd core
yarn link
yarn build
cd web
yarn link core
cd server
yarn link core
이제 server
및 web
는 core
빌드의 로컬 버전을 사용합니다.
네이티브 반응
이제 React Native 모바일 애플리케이션을 추가하여 프로젝트를 더욱 복잡하게 만들 것입니다. 우리는 Expo 으로 프로젝트를 생성하도록 선택했습니다.
이 경우 문제는 심볼릭 링크가 작동하지 않는다는 것입니다. 당신의 앱은 당신에게 좋은 충돌을 줄 것입니다.
우리는 이 모든 프로젝트 간에 코드를 올바르게 공유하는 데 성공하는 방법을 함께 볼 것입니다.
모노레포
패키지를 로컬에서 함께 연결하는 것은 좋지만 프로젝트에서 많은 패키지를 추가하면 설정하기가 번거로울 수 있습니다.
오늘날 가장 많이 사용되는 솔루션 중 하나는 모노레포를 거치는 것입니다. 간단히 말해서 모든 코드를 중앙 집중화할 저장소입니다. 이는 모든 프로젝트가 동시에 배포를 따르기 때문에 코드 구성 및 버전 관리를 단순화합니다.
원사 작업 공간
여전히 원사를 사용하고 있습니다. 이제 단일 저장소에 프로젝트가 있으므로 yarn workspace 인 단일 저장소에 매우 유용한 구성을 사용할 것입니다.
간단히 말해서, 각 프로젝트에 대해 원사 설치를 수행하는 대신 모노 리포지토리의 루트에서 한 번만 수행하면 원사가 모든 node_modules
을 루트에 설치합니다.
터보레포
모노 레포를 설정하기 위해 기본 매개 변수 설치를 처리하는 Turborepo을 사용할 것입니다.
완전한 기사의 주제가 될 수 있고 문서가 매우 훌륭하기 때문에 이 구성에 대해서는 설명하지 않겠습니다.
npx create-turbo@latest
우리의 모노레포
갑시다!
이제 웹 및 모바일 프로젝트를 만들어 보겠습니다.
cd apps
yarn create react-app web
...
npx create-expo-app mobile
이제 핵심 패키지를 만듭니다.
cd packages
mkdir core
yarn init
...
종속성 재사용 가능 노드 패키지를 만드는 방법을 모르는 경우 이에 대해 읽을 수 있습니다.
웹과 모바일의 종속성을 추가해야 합니다.
"dependencies": {
"core": "*"
}
메트로 구성
목표에 가까워지고 있습니다.
이미 빌드core
하고 실행할 수 있습니다web
.
mobile
의 경우 여전히 작동하지 않지만 걱정하지 마십시오. 거의 다 왔습니다.
이제 core
빌드가 프로젝트의 root
에 있습니다. metro
에게 폴더가 아니라 루트에 있는 node_module
를 가져오라고 지시하십시오.
먼저 main
의 package.json
속성을 수정합니다.
"main": "index.js"
이제 index.js
파일을 생성합니다.
import { registerRootComponent } from 'expo';
import App from './App';
registerRootComponent(App);
마지막으로 metro
파일을 사용하여 monorepo에 대한 metro.config.js
구성을 생성합니다.
const { getDefaultConfig } = require('expo/metro-config');
const path = require('path');
const projectRoot = __dirname;
const workspaceRoot = path.resolve(projectRoot, '../..');
const config = getDefaultConfig(projectRoot);
config.watchFolders = [workspaceRoot];
config.resolver.nodeModulesPaths = [
path.resolve(projectRoot, 'node_modules'),
path.resolve(workspaceRoot, 'node_modules'),
];
config.resolver.disableHierarchicalLookup = true;
module.exports = config;
이제 핵심 빌드를 재시도하고 모바일을 실행하여 개발을 시작할 수 있습니다.
이 기사의 예는 here 에서 찾을 수 있습니다.
Reference
이 문제에 관하여(Monorepo에서 React Native와 웹 프로젝트 간의 공유 패키지.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/simonboisset/shared-packages-between-react-native-and-web-project-in-monorepo-2c6o
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
"dependencies": {
"core": "*"
}
cd core
yarn link
yarn build
cd web
yarn link core
cd server
yarn link core
npx create-turbo@latest
갑시다!
이제 웹 및 모바일 프로젝트를 만들어 보겠습니다.
cd apps
yarn create react-app web
...
npx create-expo-app mobile
이제 핵심 패키지를 만듭니다.
cd packages
mkdir core
yarn init
...
종속성 재사용 가능 노드 패키지를 만드는 방법을 모르는 경우 이에 대해 읽을 수 있습니다.
웹과 모바일의 종속성을 추가해야 합니다.
"dependencies": {
"core": "*"
}
메트로 구성
목표에 가까워지고 있습니다.
이미 빌드core
하고 실행할 수 있습니다web
.
mobile
의 경우 여전히 작동하지 않지만 걱정하지 마십시오. 거의 다 왔습니다.
이제 core
빌드가 프로젝트의 root
에 있습니다. metro
에게 폴더가 아니라 루트에 있는 node_module
를 가져오라고 지시하십시오.
먼저 main
의 package.json
속성을 수정합니다.
"main": "index.js"
이제 index.js
파일을 생성합니다.
import { registerRootComponent } from 'expo';
import App from './App';
registerRootComponent(App);
마지막으로 metro
파일을 사용하여 monorepo에 대한 metro.config.js
구성을 생성합니다.
const { getDefaultConfig } = require('expo/metro-config');
const path = require('path');
const projectRoot = __dirname;
const workspaceRoot = path.resolve(projectRoot, '../..');
const config = getDefaultConfig(projectRoot);
config.watchFolders = [workspaceRoot];
config.resolver.nodeModulesPaths = [
path.resolve(projectRoot, 'node_modules'),
path.resolve(workspaceRoot, 'node_modules'),
];
config.resolver.disableHierarchicalLookup = true;
module.exports = config;
이제 핵심 빌드를 재시도하고 모바일을 실행하여 개발을 시작할 수 있습니다.
이 기사의 예는 here 에서 찾을 수 있습니다.
Reference
이 문제에 관하여(Monorepo에서 React Native와 웹 프로젝트 간의 공유 패키지.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/simonboisset/shared-packages-between-react-native-and-web-project-in-monorepo-2c6o
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
"main": "index.js"
import { registerRootComponent } from 'expo';
import App from './App';
registerRootComponent(App);
const { getDefaultConfig } = require('expo/metro-config');
const path = require('path');
const projectRoot = __dirname;
const workspaceRoot = path.resolve(projectRoot, '../..');
const config = getDefaultConfig(projectRoot);
config.watchFolders = [workspaceRoot];
config.resolver.nodeModulesPaths = [
path.resolve(projectRoot, 'node_modules'),
path.resolve(workspaceRoot, 'node_modules'),
];
config.resolver.disableHierarchicalLookup = true;
module.exports = config;
Reference
이 문제에 관하여(Monorepo에서 React Native와 웹 프로젝트 간의 공유 패키지.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/simonboisset/shared-packages-between-react-native-and-web-project-in-monorepo-2c6o텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)