如何配置webpack构建含React组件的npm包并输出到dist目录
报错根因
未构建的组件源码包含JSX语法,消费端webpack默认不会编译node_modules目录下的JSX/TSX文件,直接引用源码就会触发语法解析错误。
构建流水线搭建方案(Rollup,适配React组件库场景,配置更轻量化)
1. 安装必要依赖
执行命令安装构建所需的基础包:
npm i -D rollup @rollup/plugin-node-resolve @rollup/plugin-commonjs @rollup/plugin-babel rollup-plugin-peer-deps-external # 使用TypeScript的项目额外安装 @rollup/plugin-typescript # 纯JS项目可以替换为@rollup/plugin-sucrase提升JSX编译速度
提前把react、react-dom、geist相关依赖写入package.json的peerDependencies字段,避免构建时把这类宿主环境已经存在的依赖打包进去,引发重复加载、多实例报错。
2. 编写Rollup配置文件
在项目根目录新建rollup.config.js,参考配置如下:
import resolve from '@rollup/plugin-node-resolve' import commonjs from '@rollup/plugin-commonjs' import babel from '@rollup/plugin-babel' import peerDepsExternal from 'rollup-plugin-peer-deps-external' // TS项目打开下面的引入 // import typescript from '@rollup/plugin-typescript' export default { // 替换为自己项目的组件入口文件路径 input: 'src/index.js', output: [ { file: 'dist/index.cjs.js', format: 'cjs', sourcemap: true }, { file: 'dist/index.esm.js', format: 'esm', sourcemap: true } ], plugins: [ peerDepsExternal(), resolve(), commonjs(), // TS项目打开下面的配置 // typescript({ // tsconfig: './tsconfig.json', // declaration: true, // declarationDir: './dist' // }), babel({ babelHelpers: 'bundled', presets: ['@babel/preset-react'], extensions: ['.js', '.jsx', '.ts', '.tsx'], exclude: 'node_modules/**' }) ] }
配置同时输出CommonJS和ESModule两种格式的产物,分别适配require和import引用场景,TS插件会自动生成对应的.d.ts类型文件输出到dist目录。纯JS项目如果需要提供类型提示,可以执行tsc --declaration --allowJs --emitDeclarationOnly命令单独生成类型文件。
3. 调整package.json导出配置
修改package.json里的对应字段,让消费端能正确定位构建产物和类型文件:
{ "main": "dist/index.cjs.js", "module": "dist/index.esm.js", "types": "dist/index.d.ts", "files": ["dist"], "scripts": { "build": "rollup -c", "prepublishOnly": "npm run build" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0", "@geist-ui/core": "你本地使用的对应版本号" } }
files字段配置后,发布npm包时只会上传dist目录的产物,避免把源码、本地配置文件等冗余内容发布上去prepublishOnly钩子会在执行npm publish前自动运行构建命令,避免漏提交最新构建产物
可选方案说明
如果偏好使用webpack也可以完成构建,核心配置要点:
- 配置
module.rules添加对应loader处理JSX/TSX语法 - 配置
externals字段把react、geist等公共依赖标记为外部资源,不打入产物 - 配置
output.libraryTarget输出兼容CommonJS/ESModule的模块格式 - 额外配置ts-loader/babel插件生成类型文件
整体配置冗余度比Rollup高,更适合应用而非组件库场景。
构建完成后可以本地执行npm pack生成测试包,安装到业务项目验证引用正常、类型提示无问题后再发布。
内容的提问来源于stack exchange,提问作者Slowfound
相关产品推荐
相关产品推荐

