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')
})
]
};