Grunt, Webpack и DllPlugin

У меня проблемы с визуализацией, как я могу использовать DllPlugin/DllReferencePlugin с Webpack, также используя Grunt для здания. Для тех, кто не знает, DllPlugin создает отдельный пакет, который можно использовать совместно с другими пакетами. Он также создает файл манифеста (важно), чтобы помочь со ссылками. Затем DllReferencePlugin используется другим пакетом при сборке, чтобы получить предыдущий пакет DllPlugin. Для этого требуется файл манифеста, созданный ранее.

В Grunt для этого потребуется файл манифеста, созданный еще до запуска grunt, не так ли? Вот упрощенный пример кода:

webpack.dll.js

// My Dll Bundles, which creates
// - ./bundles/my_dll.js
// - ./bundles/my_dll-manifest.json
module.exports = {

    entry: {
        my_dll : './dll.js'
    },
    // where to send final bundle
    output: {
        path: './bundles',
        filename: "[name].js"
    },
    // CREATES THE MANIFEST
    plugins: [
        new webpack.DllPlugin({
            path: "./bundles/[name]-manifest.json",
            name: "[name]_lib"
        })
    ]
};

webpack.app.js

// My Referencing Bundle, which includes
// - ./bundles/app.js
module.exports = {

    entry: {
        my_app : './app.js'
    },
    // where to send final bundle
    output: {
        path: './bundles',
        filename: "[name].js"
    },
    // SETS UP THE REFERENCE TO THE DLL
    plugins: [
        new webpack.DllReferencePlugin({
          context: '.',
          // IMPORTANT LINE, AND WHERE EVERYTHING SEEMS TO FAIL
          manifest: require('./bundles/my_dll-manifest.json')
        })
    ]
};

Если вы загляните во второй раздел, webpack.app.js, я прокомментировал, где все может показаться неудачным. Чтобы DllReferencePlugin работал, ему нужен файл манифеста из DllPlugin, но в рабочем процессе Grunt grunt загрузит обе эти конфигурации при инициализации самого grunt, вызывая manifest: require('./bundles/my_dll-manifest.json') линия, чтобы потерпеть неудачу, потому что предыдущий шаг ворчания, который строит webpack.dll.js не завершено, то есть манифест еще не существует.

1 ответ

var path = require("path");
var util = require('util')
var webpack = require("webpack");

var MyDllReferencePlugin = function(options){
    webpack.DllReferencePlugin.call(this, options);
}

MyDllReferencePlugin.prototype.apply = function(compiler) {
    if (typeof this.options.manifest == 'string') {
        this.options.manifest = require(this.options.manifest);
    }

    webpack.DllReferencePlugin.prototype.apply.call(this, compiler);
};


// My Referencing Bundle, which includes
// - ./bundles/app.js
module.exports = {

    entry: {
        my_app : './app.js'
    },
    // where to send final bundle
    output: {
        path: './bundles',
        filename: "[name].js"
    },
    // SETS UP THE REFERENCE TO THE DLL
    plugins: [
        new MyDllReferencePlugin({
          context: '.',
          // IMPORTANT LINE, AND WHERE EVERYTHING SEEMS TO FAIL
          manifest: path.resolve('./bundles/my_dll-manifest.json')
        })
    ]
};
Другие вопросы по тегам