3

在 webpack 示例中,特别是

我们可以创建一个依赖于已经预先捆绑的库的捆绑包。手头的例子可以正常工作。也就是说,我们首先导航到examples/dll并运行node build.js以创建库。然后我们导航到examples/dll-user并运行node build.js以创建引用先前捆绑的库的最终捆绑包。

我的问题如下。假设examples/dll我们将配置文件修改为如下所示:

var path = require("path");
var webpack = require("../../");
module.exports = {
    entry: {
        alpha: ["./alpha", "./a", "module"],
        beta: ["./beta", "./b", "module"]
    },
    output: {
        path: path.join(__dirname, "js"),
        filename: "MyDll.[name].js",
        library: "[name]_[hash]"
    },
    plugins: [
        new webpack.DllPlugin({
            path: path.join(__dirname, "js", "[name]-manifest.json"),
            name: "[name]_[hash]"
        })
    ]
};

也就是我们添加modulebetadll中。现在我们必须拥有module. 让我们编译 dll 并继续dll-user举例。在这里,我们想做的是制作一个捆绑包,我们可以从中选择将提供的库module。让我们尝试在示例中再添加一行

console.log(require("../dll/alpha"));
console.log(require("../dll/a"));

console.log(require("beta/beta"));
console.log(require("beta/b"));

console.log(require("module"));
console.log(require("beta/module"));

在这种情况下,我希望能够使用module驻留在betadll 中的那个。不幸的是,我并不幸运。这是我尝试后得到的输出:

jmlopez in ~/Downloads/webpack-master/examples/dll-user$ node build.js 
{ [Error: Command failed: /bin/sh -c node ../../bin/webpack.js --display-reasons --display-chunks --display-modules --display-origins --output-public-path "js/" -p  ./example.js js/output.js
]
  killed: false,
  code: 2,
  signal: null,
  cmd: '/bin/sh -c node ../../bin/webpack.js --display-reasons --display-chunks --display-modules --display-origins --output-public-path "js/" -p  ./example.js js/output.js' }
Hash: bd42dda7e56ebfd7cd32
Version: webpack 2.1.0-beta.6
Time: 68ms
    Asset     Size  Chunks             Chunk Names
output.js  4.26 kB       0  [emitted]  main
chunk    {0} output.js (main) 504 bytes [rendered]
    > main [7] ./example.js 
    [7] ./example.js 210 bytes {0} [built] [1 error]
     + 7 hidden modules

ERROR in ./example.js
Module not found: Error: Can't resolve 'beta/module' in '/Users/jmlopez/Downloads/webpack-master/examples/dll-user'
 @ ./example.js 8:12-34

{ [Error: Command failed: /bin/sh -c node ../../bin/webpack.js --display-reasons --display-chunks --display-modules --display-origins --output-public-path "js/" --output-pathinfo  ./example.js js/output.js
]
  killed: false,
  code: 2,
  signal: null,
  cmd: '/bin/sh -c node ../../bin/webpack.js --display-reasons --display-chunks --display-modules --display-origins --output-public-path "js/" --output-pathinfo  ./example.js js/output.js' }

有没有办法指定捆绑包应该使用的库?我认为scope选项DllReferencePlugin可以解决问题,但似乎并非如此。

编辑:请注意,添加./a到 beta dll,然后require('beta/a')在示例中使用。似乎 webpack 很难弄清楚 node_modules。

4

1 回答 1

1

使用 NPM 中的模块创建我的 DLL 时,我遇到了类似的问题。我的解决方法是引用清单中的完整路径,而不仅仅是模块名称。

index.js - 使用 DLL 的模块

var angular = require('alpha/node_modules/angular-wrapper/lib/index'); require('alpha/node_modules/angular-ui-router/release/angular-ui-router');

使您正在使用 DLL 的项目中的 require 看起来有点难看,但它可以工作。

webpack.conf - 使用 DLL 的模块

new webpack.DllReferencePlugin({ scope: 'alpha', context: path.join(__dirname,'./node_modules/@company/ng1dll/dist/'), manifest: require('./node_modules/@company/ng1dll/dist/angular-manifest.json') })

注意:我正在通过私有 NPM 包加载我的模块。

webpack.conf - DLL 创建

module.exports = {
    entry: {
        beta: ["./beta", "./b"],
        angular: ['angular-wrapper','angular-ui-router']
    },
    output: {
        path: path.join(__dirname, "dist"),
        filename: "[name].js",
        library: "[name]_lib"

    },
    plugins: [
        new webpack.DllPlugin({
            path: path.join(__dirname, "dist", "[name]-manifest.json"),
            name: "[name]_lib"
        })
    ]
}

清单.json

{
  "name": "angular_lib",
  "content": {
    "./node_modules/angular-wrapper/lib/index.js": 1,
    "./node_modules/angular-wrapper/node_modules/angular/index.js": 2,
    "./node_modules/angular-wrapper/node_modules/angular/angular.js": 3,
    "./node_modules/angular-ui-router/release/angular-ui-router.js": 4
  }
}
于 2016-05-26T09:25:19.813 回答