2016-05-01 50 views
1

我很難想象如何利用帶有Webpack的DllPlugin/DllReferencePlugin,同時也使用Grunt作爲建築物。對於那些沒有知識的人,DllPlugin創建一個單獨的包,可以與其他包共享。它還會創建一個清單文件(重要)來幫助鏈接。然後,DllReferencePlugin被另一個軟件包用於構建時抓取之前製作的DllPlugin Bundle。爲此,它需要先前創建的清單文件。Grunt,Webpack和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的上一個grunt步驟沒有完成,意味着清單尚不存在。

回答

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

請儘量避免將代碼轉儲爲答案,並嘗試解釋它的作用和原因。對於那些沒有相關編碼經驗的人來說,你的代碼可能並不明顯。 – Frits

+0

謝謝!你是一個拯救生命的人。 – zjm555