MS 시리즈를 시작한 것이 벌써 2년전이 되어서 nx 최신 버전으로 업데이트를 진행한다.
NX 환경 버전업
nodejs는 최신 LST 버전인 18.16.0 을 사용한다.
$ nvm install 18.16.0
또는 설치되어 있다면
$ nvm use 18.16.0
create-nx-workspace 최신으로 frontend 폴더 밑으로 비어있는 apps, libs 환경을 생성한다.
$ npx create-nx-workspace@latest frontend
// 옵션 선택
> integrated monorepos
> react
> portal/web (애플리케이션 위치)
> webpack (번들러)
> SCSS (스타일 프리컴파일러)
> No CI
생성결과
apps/portal/web 이 생성되었다. 사용하지 않는 web-e2e를 정리한다. 별도의 애플리케이션을 생성하려면 workspace.json 파일을 루트 폴더에 생성한다.
// workspace.json 내용
{
"version": 2,
"projects": {
"asset-web": "apps/micro-apps/asset",
"dashboard-web": "apps/micro-apps/dashboard",
"management-web": "apps/micro-apps/management",
"portal-web": "apps/portal/web",
"system-web": "apps/micro-apps/system",
"user-web": "apps/micro-apps/user"
},
"cli": {
"defaultCollection": "@nrwl/react"
},
"generators": {
"@nrwl/react": {
"application": {
"style": "scss",
"linter": "eslint",
"babel": true
},
"component": {
"style": "scss"
},
"library": {
"style": "scss",
"linter": "eslint"
}
}
},
"defaultProject": "portal-web"
}
애플리케이션 생성 명령어
// 5개의 애플리케이션을 생성하고, SASS, webpack을 선택하여 생성한다.
nx g @nrwl/react:app micro-apps/dashboard
nx g @nrwl/react:app micro-apps/asset
nx g @nrwl/react:app micro-apps/management
nx g @nrwl/react:app micro-apps/system
nx g @nrwl/react:app micro-apps/user
패키지를 생성한다.
// SASS, jest, rollup 을 선택한다.
nx g @nrwl/react:lib web/login/default --publishable --importPath=@gv/web-login-default
새로운 패키지와 애플리케이션이 생성된 폴더에 모든 soucre files 을 copy & paste 한다.
버전업 이후 수정사항
React v17 -> v18 업데이트후 변경점. main.tsx 에서 root 생성 방법이 변경되었다.
// React v17
import * as ReactDOM from 'react-dom';
...
ReactDOM.render(
<Suspense fallback={<GVSpinner isFull />}>
<GVMicroApp />
</Suspense>,
document.getElementById('root')
);
// React v18
import * as ReactDOM from 'react-dom/client';
...
const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement);
root.render(
<Suspense fallback={<GVSpinner isFull />}>
<GVMicroApp />
</Suspense>
);
AntD v4 -> v5 로 변경되면서 v5에서 cssinjs 방식을 사용하면서 *.less 방식이 사라졌다. 기본적인 reset.css만을 설정한다.
// styles.scss 에 reset.css 포함
// AntD reset
@import "~antd/dist/reset.css";
// project.json에 styles.scss 포함
"options": {
"compiler": "babel",
...
"styles": ["apps/micro-apps/dashboard/src/styles.scss"],
...
"webpackConfig": "apps/micro-apps/dashboard/webpack.config.js"
},
Webpack의 min-css-extract-plugin을 사용하면서 build warning 나오는 import ordering 메세지 제거하기
// webpack.config.js
module.exports = composePlugins(withNx(), withReact(), (config) => {
// Update the webpack config as needed here.
// e.g. `config.plugins.push(new MyPlugin())`
// .tsx 에서 import 구문 ordering 경고 문구 발생 해결하기
// https://github.com/facebook/create-react-app/issues/5372
const instanceOfMiniCssExtractPlugin = config.plugins.find(
(plugin) => plugin.constructor.name === 'MiniCssExtractPlugin'
);
if (instanceOfMiniCssExtractPlugin) {
instanceOfMiniCssExtractPlugin.options.ignoreOrder = true;
}
return config;
});
Nx를 업데이트하면 기존의 workspace.json 파일을 사용하지 않는다. 그리고 webpack v5.* 버전을 사용한다. webpack v5는 Module Federation을 지원하므로 이에 대한 설정을 진행해 본다.
<참조>
https://mobicon.tistory.com/586
https://webpack.kr/concepts/module-federation/
'React > Architecture' 카테고리의 다른 글
[MS-13] Module Federation 개념 및 NX기반 환경 설정 (0) | 2023.05.12 |
---|---|
[MS-11] i18n 외부파일 위치 변경 및 Web Dev Server 연결 (0) | 2021.10.07 |
[MS-10] API/Web i18n 적용 및 리팩토링 (0) | 2021.10.02 |
[MS-9] Login 화면 개발 (0) | 2021.09.30 |
[MS-8] NestJS Auth/Role 기능 Gateway에 추가하기 (0) | 2021.09.30 |