Webpack 如何在网页包DLL中包含npm模块?
我正在尝试使用webpack(1.13版)的DLL插件创建一个DLL包,其中包含我的各种React项目(即preact、preact compat、redux、React-redux、redux saga、recompose)所需的所有npm模块。我想通过我的商店的内部npm repo分发包含所有这些npm模块的DLL包。一些web应用程序应该从npm repo加载DLL包,并使用其中包含的模块 在的示例中,alpha DLL中包含名为Webpack 如何在网页包DLL中包含npm模块?,webpack,Webpack,我正在尝试使用webpack(1.13版)的DLL插件创建一个DLL包,其中包含我的各种React项目(即preact、preact compat、redux、React-redux、redux saga、recompose)所需的所有npm模块。我想通过我的商店的内部npm repo分发包含所有这些npm模块的DLL包。一些web应用程序应该从npm repo加载DLL包,并使用其中包含的模块 在的示例中,alpha DLL中包含名为module的模块模块来自示例目录中的节点_modules目
module
的模块<代码>模块来自示例目录中的节点_modules目录(dll目录下的一个目录)
这是可行的,当我使用node build.js在dll user dir中构建示例并查看dll user/js/output.js
,我可以看到以下几行:
/*!*****************************************************************************************!*\
!*** 来自dll参考alpha_e0d5512587ca63cbbd71***的委派../node_modules/module.js!
\*****************************************************************************************/
名为module
的模块实际上不是一个合适的npm模块,它只是一个名为module.js
的文件,直接位于node\u module
目录中。我尝试包含一个“真实世界”的npm模块,在本例中是preact
在构建dll
和dll user
项目后,查看output.js
文件,我可以看到preact模块的整个代码都包含在输出中,没有发生委托
如何使其正常工作?这是网页中的错误吗?
我在GitHub上创建了一个代码示例,该示例基于显示问题的webpack DLL示例:EDIT:
最初,我只是让给定的示例起作用,但不知道应该如何使用所有东西。我写了这篇文章(下面是新内容):
好吧,我想我至少得到了一部分。 我会告诉你,为了让你的榜样发挥作用,你必须做些什么 有两种方法可以让它工作:
包.json
(和节点_模块
,如有必要)中删除前置
,即顶层。现在只有dll
文件夹中有preact
然后在
dll用户中更改require
调用example.js
文件夹到
require(“../dll/node\u modules/preact”)
这应该行得通,但并不完全是我们想要的
preact
,但仅将其安装到包含的文件夹中。运行这两个构建脚本,并查看
output.js
中所委托的所有内容,包括preact
新建: 好的,我想在这里多戳一戳之后,它是如何工作的。(因为我们彼此了解,而且在一起工作的话会少一些,但我认为如果我在细节上更明确一点,这也可能对其他人有所帮助,所以请容忍我。) 初步说明:我假设您想要创建一个dll文件,1)可以使用npm安装到项目中,2)以某种方式将单独的脚本标记包含到HTML中。该脚本在执行时创建一个全局变量,该变量公开一个函数,应用程序脚本使用该函数来解析依赖关系。 此外,我假设您已经为dll包设置了一个目录,并且只安装了
package.json
和webpack ready
首先创建一个webpack.config.js
,如下所示:
var webpack = require("webpack");
var path = require("path");
module.exports= {
entry: ["preact"], // put here every module that goes into the dll
output: {
path: __dirname,
filename: "index.js",
library: "[name]_[hash]"
},
plugins: [
new webpack.DllPlugin({
path: path.join(__dirname, "[name]-manifest.json"),
name: "[name]_[hash]" // (keep consistent with output.library)
})
]
};
现在使用创建捆绑包及其清单
$ webpack
dll项目文件夹的结构现在是:
dll-project
|_ node_modules
| |_ preact
|_ main.js
|_ main-mainifest.json
|_ package.json
|_ webpack.config.js
现在,您已将此软件包安装到另一个项目中,您的应用程序:
app
|_ node_modules
| |_ dll-project
|_ index.js
|_ package.json
|_ webpack.config.js
这个webpack.config.js
看起来像(或类似于):
在您的index.js
即您的应用程序代码中,您需要dll包中的模块,如下所示:
var React = require("mydll/node_modules/preact/dist/preact");
如果运行webpack-d
,您将在生成的app.js
中看到如下内容:
/* 1 */
/*!***************************************************************************************************!*\
!*** delegated ./node_modules/preact/dist/preact.js from dll-reference main_2057857de340fdcfd8aa ***!
\***************************************************************************************************/
有人可能会问:“为什么我不能使用我的标准requires,比如require(“preact”)
?”。答案是:你可以,但是。但在这种情况下,您必须在应用程序中安装dll包中的所有依赖项。因为在本例中,您将使用“映射模式”而不是“范围模式”(请参阅)
在作用域模式下,您必须显式地要求模块相对于清单的路径。好处是:您不必在应用程序中安装模块(并将其作为package.json
中的依赖项)
在映射模式下,您可以像往常一样需要该模块(就像它安装在应用程序的节点_模块中一样),但您也必须使用应用程序将其安装在dll中。这是因为Webpack将首先评估require
调用,然后意识到同一模块也在dll包中,因此只在输出中呈现别名(“委托…”)
现在我认为这两种模式都有用处。如果您只构建应用程序本地dll以加快构建速度,则映射模式很酷。在这种情况下,您将在本地安装并保存进入dll的所有DEP。但是,如果您想构建一个dll捆绑包作为一个可安装的模块,并在应用程序之间共享它-并且您不想跟踪每个应用程序中dll中的所有模块-您很可能希望使用作用域模式,从而付出更详细的require
调用的代价。您可以尝试这种方法
new webpack.DllReferencePlugin({
context: process.cwd(), // Important
manifest: manifest.json
}),
谢谢,我会检查你的解决方案,然后再给你回复。有趣的是,at(手机优化版)的人正做着我所做的事情
new webpack.DllReferencePlugin({
context: process.cwd(), // Important
manifest: manifest.json
}),