使用 Webpack 编译的应用程序的插件系统
Plugin system for apps compiled using Webpack
对于上下文:我在后端使用 Symfony 开发自己的产品,在前端使用 react/react-router,它们由 Webpack 捆绑在一起。我打算将我的应用程序分成 "extensions",所以我会有 "core" 捆绑包和围绕它的多个不同的扩展捆绑包(这将是我的产品的附加功能集)。
现在,我希望我的前端与我的后端一样可扩展。我希望能够将带有扩展包的新 React 组件添加到 "CoreBundle".
中现有的 "core" 组件集
然而,Webpack 似乎将所有内容封装得太严密,无法生成那种插件系统。是否有可能拥有多个具有独立 Webpack 配置的捆绑包,但它们的 JavaScript 将以允许开发插件系统的方式互连?目标是能够独立开发一个Bundle的JS,但同时能够在这个过程中使用另一个Bundle中一些已经编译好的JS资源。
我认为您应该能够使用 DllPlugin 和 DllReferencePlugin 实现此目的
The DllPlugin is used in a separate webpack config to create a dll
only bundle. It also creates a manifest.json file which is used by the
DllReferencePlugin to map dependencies.
请参阅
处的详细文档
https://webpack.js.org/plugins/dll-plugin/
在我的例子中,我使用它将所有供应商库(React、Flux 等)组合到一个构建中,然后将其用作我的其他 Webpack 配置中的参考,它捆绑了我所有的 React 组件等,但参考了 React和其他使用 DllReferencePlugin 的库。
我的 webpack.dll.js 配置文件:
var path = require("path");
var webpack = require("webpack");
module.exports = {
entry: {
libs: [path.join(__dirname, "common", "lib.js")]
},
output: {
path: path.join(__dirname, "dist", "dll"),
filename: "[name].dll.js",
library: "[name]"
},
plugins: [
new webpack.DllPlugin({
path: path.join(__dirname, "dll", "[name]-manifest.json"),
name: "[name]",
context: path.resolve(__dirname, "common")
}),
]
};
然后在我的主要 webpack.config.js 中,我使用了参考插件。
new webpack.DllReferencePlugin({
context: path.resolve(__dirname, "common"),
manifest:require('./dll/libs-manifest.json')
})
根据您希望如何拆分代码,您可以创建多个 Dll,每个 Dll 都根据您的要求使用单独的 webpack 配置。然后根据您在其他不同 webpack 包中的要求引用 dll。
对于上下文:我在后端使用 Symfony 开发自己的产品,在前端使用 react/react-router,它们由 Webpack 捆绑在一起。我打算将我的应用程序分成 "extensions",所以我会有 "core" 捆绑包和围绕它的多个不同的扩展捆绑包(这将是我的产品的附加功能集)。
现在,我希望我的前端与我的后端一样可扩展。我希望能够将带有扩展包的新 React 组件添加到 "CoreBundle".
中现有的 "core" 组件集然而,Webpack 似乎将所有内容封装得太严密,无法生成那种插件系统。是否有可能拥有多个具有独立 Webpack 配置的捆绑包,但它们的 JavaScript 将以允许开发插件系统的方式互连?目标是能够独立开发一个Bundle的JS,但同时能够在这个过程中使用另一个Bundle中一些已经编译好的JS资源。
我认为您应该能够使用 DllPlugin 和 DllReferencePlugin 实现此目的
The DllPlugin is used in a separate webpack config to create a dll only bundle. It also creates a manifest.json file which is used by the DllReferencePlugin to map dependencies.
请参阅
处的详细文档https://webpack.js.org/plugins/dll-plugin/
在我的例子中,我使用它将所有供应商库(React、Flux 等)组合到一个构建中,然后将其用作我的其他 Webpack 配置中的参考,它捆绑了我所有的 React 组件等,但参考了 React和其他使用 DllReferencePlugin 的库。
我的 webpack.dll.js 配置文件:
var path = require("path");
var webpack = require("webpack");
module.exports = {
entry: {
libs: [path.join(__dirname, "common", "lib.js")]
},
output: {
path: path.join(__dirname, "dist", "dll"),
filename: "[name].dll.js",
library: "[name]"
},
plugins: [
new webpack.DllPlugin({
path: path.join(__dirname, "dll", "[name]-manifest.json"),
name: "[name]",
context: path.resolve(__dirname, "common")
}),
]
};
然后在我的主要 webpack.config.js 中,我使用了参考插件。
new webpack.DllReferencePlugin({
context: path.resolve(__dirname, "common"),
manifest:require('./dll/libs-manifest.json')
})
根据您希望如何拆分代码,您可以创建多个 Dll,每个 Dll 都根据您的要求使用单独的 webpack 配置。然后根据您在其他不同 webpack 包中的要求引用 dll。