Webpack:如何使用动态捆绑来组合两个完全独立的捆绑包

IT技术 reactjs build webpack webpack-2
2021-05-14 10:19:38

我花了很多时间研究这个问题,但无济于事。我知道如何使用importpromise API在 Webpack 中进行代码拆分和动态捆绑

然而,我的用例是我有两个完全独立的包,使用不同的 webpack 构建分别生成。为了给您提供视角,我正在构建 React 组件,并且需要将 React 组件动态加载到已在不同进程中编译的页面中。这在react中可能吗?我确实可以控制两个 webpack 构建,因此我可以排除依赖项等。

更新:我刚刚看了 Vue.js,以及它如何允许开发人员注册 Vue.js 组件,然后在代码中稍后引用它们。我可能会在我的页面脚本之前加载我的 Vue.js 组件脚本。我想看看我是否可以在 React 中做类似的事情。

1个回答

我是否正确理解您:您基本上已经

  1. 自定义 React 组件库(由 Webpack build #1 构建)
  2. 一个需要使用部分(全部)组件的 React 应用程序(由 Webpack build #2 构建,与 #1 完全分开)

?

如果是,请继续阅读。

“这是可能的react呢?” 问题应该是“这在 Webpack 中可行吗?” ,答案是“是”以下内容已使用 Webpack 2 进行测试,但也应适用于 v.1。

让我们调用您的项目Lib(您的 React 组件库)和App(库使用者)。

Lib项目中:

  1. 创建一个入口点文件,例如index.js,导出所有自定义 React 组件,如下所示:

    import {Button} from './button';
    import {DatePicker} from './DatePicker';
    import {TextBox} from './textBox';
    
    export const MyComponentLib = {
        Button,
        DatePicker,
        TextBox
    };
    
  2. 更新webpack.config.js使项目的包成为 UMD 库(也可以是“var”),并将入口点设置为上述index.js文件。这样做将使您的库稍后在消费应用程序中通过名为MyComponentLib(名称来自export上述名称的全局变量可用

     ...
     output: {
         path: './dist',
         filename: 'mylib.bundle.js',
         libraryTarget: 'umd'
     },
     ...
     entry: './index.js',
     ...
    

进入App项目:

  1. 在该index.html文件中,您将有两个<script>标签:一个用于mylib.bundle.jsLib项目的输出),另一个用于App项目本身的捆绑包你可能有更多的包(应用程序、供应商等),我只是在这里简化事情。

  2. 更新webpack.config.js以将组件库标记为外部依赖项。这里,MyComponentLib再次是库可用的全局变量myComponents的名称,并且是在import语句中使用的名称

    ...
    externals: {
        myComponents: 'MyComponentLib'
    }, 
    ...
    

现在,App您可以导入这样的组件:

import {DatePicker} from 'myComponents';

这将在运行时通过全局变量从组件库动态加载 DatePicker。

奖励:如果您使用eslint,您不希望它抱怨缺少您知道是外部的module;将此添加到您的.eslintrc

...
"settings": {
      "import/core-modules": ["myComponents"]
},
...