이 질문은 "가장 좋은 방법"이 몇 줄의 응답보다 복잡하기 때문에 매우 길고 자세한 답변이 필요하기 때문에 매우 긴 답변입니다.
IV는 그 기간에 3.5 년 이상 사내 라이브러리를 유지했습니다. iv'e는 라이브러리를 묶어야한다고 생각하는 두 가지 방법으로 결정합니다. 트레이드 오프는 라이브러리의 크기에 따라 다르며 개인적으로 우리는 소비자.
방법 1 : 노출 된 모든 대상 및 대상 롤업을 입력으로 사용하여 index.ts 파일을 만듭니다. 전체 라이브러리를 단일 index.js 파일과 index.css 파일로 묶습니다. 라이브러리 코드의 중복을 피하기 위해 소비자 프로젝트에서 외부 종속성이 상속됩니다. (구성 예제 하단에 포함 된 요점)
- 장점 : 프로젝트 소비자가 루트 상대 라이브러리 경로에서 모든 것을 가져올 수 있으므로 사용하기 쉬움
import { Foo, Bar } from "library"
- 단점 : 이것은 결코 나무를 흔들 수 없습니다. 사람들이 ESM을 사용하여이 작업을 수행하기 전에 트리 쉐이킹이 가능합니다. NextJS는 현재 단계에서 ESM을 지원하지 않으며 많은 프로젝트 설정을 수행하지 않으므로이 빌드를 CJS로 컴파일하는 것이 좋습니다. 누군가가 귀하의 구성 요소 중 하나를 가져 오면 모든 구성 요소에 대한 모든 CSS와 모든 자바 스크립트를 가져옵니다.
방법 2 : 이것은 고급 사용자를위한 것입니다. 모든 내보내기에 대해 새 파일을 만들고 사용하는 CSS 시스템에 따라 "preserveModules : true"옵션을 사용하여 rollup-plugin-multi-input을 사용하십시오. CSS는 단일 파일로 병합되지 않지만 롤업 후 출력 파일 내에 각 CSS 파일 require ( ". css") 문이 남아 있고 해당 CSS 파일이 존재합니다.
- 장점 : 사용자가 "library / dist / foo"에서 {Foo}를 가져 오면 Foo 용 코드와 Foo 용 CSS 만 가져옵니다.
- 단점 :이 설정은 NextJS를 사용한 빌드 구성에서 소비자가 node_modules require ( ". css") 문을 처리해야하는 것과 관련이 있으며 이는
next-transpile-modules
npm 패키지 로 수행 됩니다.
- 주의 사항 : 우리는 당신이 여기에서 찾을 수있는 우리 자신의 바벨 플러그인을 사용합니다 : https://www.npmjs.com/package/babel-plugin-qubic 사람들이
import { Foo,Bar } from "library"
다음에 바벨로 변환 할 수 있도록 ...
import { Foo } from "library/dist/export/foo"
import { Bar } from "library/dist/export/bar"
실제로 두 방법을 모두 사용하는 여러 롤업 구성이 있습니다. 따라서 나무 흔들림을 신경 쓰지 않는 라이브러리 소비자 "Foo from "library"
는 단일 CSS 파일을 가져오고 가져올 수 있습니다 . 그리고 나무 흔들림을 관리하고 중요한 CSS 만 사용하는 라이브러리 소비자의 경우 babel 플러그인을 켤 수 있습니다.
모범 사례를위한 롤업 안내서 :
타이프 스크립트를 사용하든 아니든 항상 빌드 "rollup-plugin-babel": "5.0.0-alpha.1"
하십시오. .babelrc가 다음 과 같은지 확인하십시오.
{
"presets": [
["@babel/preset-env", {
"targets": {"chrome": "58", "ie": "11"},
"useBuiltIns": false
}],
"@babel/preset-react",
"@babel/preset-typescript"
],
"plugins": [
["@babel/plugin-transform-runtime", {
"absoluteRuntime": false,
"corejs": false,
"helpers": true,
"regenerator": true,
"useESModules": false,
"version": "^7.8.3"
}],
"@babel/plugin-proposal-class-properties",
"@babel/plugin-transform-classes",
["@babel/plugin-proposal-optional-chaining", {
"loose": true
}]
]
}
그리고 롤업에서 babel 플러그인이 다음과 같이 보입니다 ...
babel({
babelHelpers: "runtime",
extensions,
include: ["src/**/*"],
exclude: "node_modules/**",
babelrc: true
}),
그리고 package.json은 다음과 같이 ATLEAST를 찾습니다.
"dependencies": {
"@babel/runtime": "^7.8.3",
"react": "^16.10.2",
"react-dom": "^16.10.2",
"regenerator-runtime": "^0.13.3"
},
"peerDependencies": {
"react": "^16.12.0",
"react-dom": "^16.12.0",
}
그리고 마지막으로 ATLEAST처럼 보이는 롤업의 외부 장치.
const makeExternalPredicate = externalArr => {
if (externalArr.length === 0) return () => false;
return id => new RegExp(`^(${externalArr.join('|')})($|/)`).test(id);
};
//... rest of rollup config above external.
external: makeExternalPredicate(Object.keys(pkg.peerDependencies || {}).concat(Object.keys(pkg.dependencies || {}))),
// rest of rollup config below external.
왜?
- 이것은 자동으로 반응 / 반응-돔과 소비자 프로젝트에서 다른 피어 / 외부 종속성을 상속하기 위해 똥을 묶습니다. 즉, 번들에서 복제되지 않습니다.
- 이것은 ES5에 번들됩니다
- 이것은 소비자 프로젝트에서 objectSpread, 클래스 등의 모든 babel 도우미 함수에서 자동으로 필요합니다 ( ".."). 이는 번들 크기에서 15-25KB를 지우고 objectSpread 도우미 함수가 라이브러리에서 복제되지 않음을 의미합니다 출력 + 소비 프로젝트 번들 출력.
- 비동기 기능은 여전히 작동합니다
- externals는 해당 피어 종속 접미사로 시작하는 항목과 일치합니다. 즉, babel-helpers는 babel-helpers / helpers / object-spread에 대해 external과 일치합니다.
마지막으로 단일 index.js 파일 출력 롤업 구성 파일의 예가 있습니다.
https://gist.github.com/ShanonJackson/deb65ebf5b2094b3eac6141b9c25a0e3
여기서 대상 src / export / index.ts는 다음과 같습니다 ...
export { Button } from "../components/Button/Button";
export * from "../components/Button/Button.styles";
export { Checkbox } from "../components/Checkbox/Checkbox";
export * from "../components/Checkbox/Checkbox.styles";
export { DatePicker } from "../components/DateTimePicker/DatePicker/DatePicker";
export { TimePicker } from "../components/DateTimePicker/TimePicker/TimePicker";
export { DayPicker } from "../components/DayPicker/DayPicker";
// etc etc etc
babel, rollup에 문제가 있거나 번들링 / 라이브러리에 대한 질문이 있으면 알려주십시오.
imported
코드에 있던 파일 만 가져와 번들 크기를 줄입니다.