我是否正确理解您:您基本上已经
- 自定义 React 组件库(由 Webpack build #1 构建)
- 一个需要使用部分(全部)组件的 React 应用程序(由 Webpack build #2 构建,与 #1 完全分开)
?
如果是,请继续阅读。
该“这是可能的react呢?” 问题应该是“这在 Webpack 中可行吗?” ,答案是“是”。以下内容已使用 Webpack 2 进行测试,但也应适用于 v.1。
让我们调用您的项目Lib
(您的 React 组件库)和App
(库使用者)。
在Lib
项目中:
创建一个入口点文件,例如index.js
,导出所有自定义 React 组件,如下所示:
import {Button} from './button';
import {DatePicker} from './DatePicker';
import {TextBox} from './textBox';
export const MyComponentLib = {
Button,
DatePicker,
TextBox
};
更新webpack.config.js
使项目的包成为 UMD 库(也可以是“var”),并将入口点设置为上述index.js
文件。这样做将使您的库稍后在消费应用程序中通过名为MyComponentLib
(名称来自export
上述名称)的全局变量可用:
...
output: {
path: './dist',
filename: 'mylib.bundle.js',
libraryTarget: 'umd'
},
...
entry: './index.js',
...
进入App
项目:
在该index.html
文件中,您将有两个<script>
标签:一个用于mylib.bundle.js
(Lib
项目的输出),另一个用于App
项目本身的捆绑包。你可能有更多的包(应用程序、供应商等),我只是在这里简化事情。
更新webpack.config.js
以将组件库标记为外部依赖项。这里,MyComponentLib
再次是库可用的全局变量myComponents
的名称,并且是在import
语句中使用的名称:
...
externals: {
myComponents: 'MyComponentLib'
},
...
现在,App
您可以导入这样的组件:
import {DatePicker} from 'myComponents';
这将在运行时通过全局变量从组件库动态加载 DatePicker。
奖励:如果您使用eslint
,您不希望它抱怨缺少您知道是外部的module;将此添加到您的.eslintrc
:
...
"settings": {
"import/core-modules": ["myComponents"]
},
...