Skip to main content

打包构建

info
  • 编写构建打包脚本
  • 开发调试
  • 相关代码可在 git tag v1.2 查看

打包配置和脚本参考 React 官方仓库的构建代码

这里适当做了一些调整和优化。

新增 build 命令

  • scripts/rollup 目录下, 新增文件 build.js
  • package.json新增 build 命令
package.json
{
"private": true,
"workspaces": ["packages/*"],
"type": "module",
"scripts": {
"lint": "eslint --ext .ts,.jsx,.tsx --fix --quiet ./packages",
"build": "node ./scripts/rollup/build.js",
"upgrade": "yarn upgrade-interactive --latest"
},
"keywords": [],
"author": "",
"license": "MIT",
"devDependencies": {
"@types/node": "^22.10.2",
"eslint": "^9.17.0",
"eslint-plugin-import-x": "^4.5.0",
"globals": "^15.13.0",
"mkdirp": "^3.0.1",
"ncp": "^2.0.0",
"prettier": "^3.4.2",
"rimraf": "^6.0.1",
"rollup": "^4.28.1",
"rollup-plugin-typescript2": "^0.36.0",
"typescript": "^5.6.3",
"typescript-eslint": "^8.18.0"
},
"packageManager": "yarn@1.22.22"
}

安装构建包

yarn add mkdirp rimraf ncp rollup-plugin-typescript2 -D -W

目录结构

scripts/rollup
└── build.js
└── bundles.js
└── modules.js
└── packaging.js
└── utils.js

编写脚本

scripts/rollup/bundles.js
const bundleTypes = {
NODE_DEV: "NODE_DEV",
NODE_PROD: "NODE_PROD",
};

const { NODE_DEV, NODE_PROD } = bundleTypes;

const bundles = [
/******* Isomorphic *******/
{
bundleTypes: [NODE_DEV, NODE_PROD],
entry: "react",
global: "React",
},

/******* React JSX Runtime *******/
{
bundleTypes: [NODE_DEV, NODE_PROD],
entry: "react/jsx-runtime",
global: "JSXRuntime",
externals: ["react"],
},

/******* React JSX DEV Runtime *******/
{
bundleTypes: [NODE_DEV, NODE_PROD],
entry: "react/jsx-dev-runtime",
global: "JSXDEVRuntime",
externals: ["react"],
},
];

export function getFilename(bundle, bundleType) {
let name = bundle.entry;
// we do this to replace / to -, for react-dom/server
name = name.replace("/index.", ".").replace("/", "-");
switch (bundleType) {
case NODE_DEV:
return `${name}.development.js`;
case NODE_PROD:
return `${name}.production.js`;
}
}

export default {
bundles,
bundleTypes,
};

输出目录结构

build/node_modules
└── react
└── cjs
└── react-jsx-dev-runtime.development.js
└── react-jsx-dev-runtime.production.js
└── react-jsx-runtime.development.js
└── react-jsx-runtime.production.js
└── react.development.js
└── react.production.js
└── index.js
└── js-dev-runtime.js
└── js-runtime.js
└── LICENSE
└── package.json
└── README.md

开发调试

使用create-react-app创建一个新项目。

pnpm link react/build/node_modules/react

// 解除链接后,pnpm 不会自动删除实际的依赖包或目录,只是移除了符号链接,恢复正常的包管理方式。
// 如果需要完全清除包的依赖,可以使用 pnpm install 或者手动删除相关的依赖。
pnpm unlink react/build/node_modules/react