我設法找出了這一個。對於任何想要做同樣事情的人來說,這就是需要發生的事情。
您需要爲角度庫及其依賴關係中的每個umd模塊添加腳本標記,或者執行我所做的操作並創建一個吞嚥任務以按正確的順序連接這些庫並創建一個包含代碼的供應商文件並在腳本標記中引用它。
一旦你加載UMD模塊,然後你可以告訴你的WebPack配置忽略特定的模塊,並使用externals
配置屬性它們委託給一個全局變量:
externals: [
{
'hammerjs': 'Hammer',
'lodash': '_',
'core-js/es6': 'core',
'core-js/es7/reflect': 'core',
'zone.js/dist/zone': 'Zone',
'@angular/core': 'ng.core',
'@angular/compiler': 'ng.compiler',
'@angular/common': 'ng.common',
'@angular/platform-browser': 'ng.platformBrowser',
'@angular/platform-browser-dynamic': 'ng.platformBrowserDynamic',
'@angular/http': 'ng.http',
'@angular/router': 'ng.router',
'@angular/forms': 'ng.forms',
'@angular/flex-layout': 'ng.flexLayout',
'@angular/material': 'ng.material'
},
function(context, request, callback) {
if (/^rxjs/.test(request)) {
return callback(null, 'Rx');
}
callback();
}
],
這樣做有什麼說的WebPack是任何時候遇到這些導入之一時,請使用全局變量來引用它。現在存在全局變量,因爲我們使用umd文件並單獨加載這些文件。那裏的函數用於rxjs,並且在遇到以「rxjs」開頭的導入語句時使用全局變量Rx
。
下面列出了umd文件,以防有人不知道這一點。這些文件是通過一個全局變量在不同的模塊裝載機可導入以及訪問:
// Third party JavaScript libs
'./node_modules/hammerjs/hammer.min.js', // Required by @angular/material
'./node_modules/lodash/lodash.min.js',
// Polyfills (required by @angular/*)
'./node_modules/core-js/client/shim.min.js',
'./node_modules/zone.js/dist/zone.min.js',
// RxJS
'./node_modules/rxjs/bundles/Rx.min.js', // Required by @angular/*
// Angular Framework (order matters)
'./node_modules/@angular/core/bundles/core.umd.min.js',
'./node_modules/@angular/common/bundles/common.umd.min.js',
'./node_modules/@angular/compiler/bundles/compiler.umd.min.js', // Don't need this if using AoT...
'./node_modules/@angular/platform-browser/bundles/platform-browser.umd.min.js', // Used for AoT
'./node_modules/@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.min.js', // Used for JiT
'./node_modules/@angular/http/bundles/http.umd.min.js',
'./node_modules/@angular/forms/bundles/forms.umd.min.js',
'./node_modules/@angular/router/bundles/router.umd.min.js',
// Third party Angular libraries
'./node_modules/@angular/flex-layout/bundles/flex-layout.umd.js',
'./node_modules/@angular/material/bundles/material.umd.js'
這個過程可以讓你改變「供應商」的JavaScript包,而無需在每個依賴於它的應用程序的WebPack運行。當然,如果需要新的功能,你需要在應用程序上運行webpack,但是如果不更改角度或其他外部庫而不更改,那麼這將很有用。唯一的缺點是樹型抖動現在不適用於供應商代碼......但它仍然適用於使用webpack的應用程序。