我目前将Angular 2应用与WebPack捆绑在一起。我们仍在快速旋转,因此,我们希望包括变化不大的Angular 2 UMD CDN准备好的捆绑包,而不是在构建和应用程序加载过程中增加延迟,例如:
<script src="https://npmcdn.com/@angular/[email protected]/bundles/core.umd.min.js"></script>
<script src="https://npmcdn.com/@angular/[email protected]/bundles/common.umd.min.js"></script>
<script src="https://npmcdn.com/@angular/[email protected]/bundles/compiler.umd.min.js"></script>
plugins: [ new webpack.optimize.CommonsChunkPlugin("vendor", "vendor.bundle.js") ]
,我的应用程序包很小,但是每次构建时,我都会手动构建一个单独的,唯一的1MB包,其中包含大多数Angular 2框架。根据我的应用程序,此文件的每个内部版本都会稍有变化,并且在我的应用程序版本或各种应用程序之间不具有可移植性,并且没有“ CDN”的好处。当然,我必须包含此文件才能运行我的应用程序。@angular|rxjs
,例如plugins: [ new webpack.IgnorePlugin(/\@angular|rxjs/) ]
,它会排除供应商文件,但会插入硬编码的异常,并在应用程序包的顶部抛出错误。externals: ['@angular/core', ...
,我function(module, exports) { module.exports = @angular/core; },
在我的应用程序包中获得输出,这显然不起作用。WebPack文档不是非常有用,但是我认为我可以指定一个libraryTarget
或引用的resolve函数,该函数将指示WebPack在模块加载时进行编译。System.register()
指向我期望的NPM命名空间的调用,例如System.register("myapp/boot", ['@angular/core', ...
,但是我仍在SystemJS配置上进行调用UMD。附带说明,相对于WebPack生成的文件,此文件的大小要多25%。如何构建不依赖于唯一重新包装的Angular 2捆绑包的应用捆绑包?
我目前正在针对RC3进行构建。如上所述,我的流程目前是WebPack,但是如果这样可以简化的话,我将转到另一个工具集。
做更多的研究,我认为我已经被WebPack的“ Loader”术语所误导了。我必须使用模块加载器,但看起来WebPack并没有一个可以使用的模块加载器。
要分配UMD捆绑软件模块名称空间(和关联依赖关系),不能将其加载到脚本标签中。相反,它们必须在给定的this
上下文中进行评估以充当模块引用。这意味着即使我希望它们全部都同步加载,我仍然必须配置诸如SystemJS之类的东西才能通过网络加载它们,以便控制/包装它们的上下文。
这款Angular 2矮喇叭靠近我要寻找的东西。它使用Angular 2 UMD捆绑软件,但不使用RxJs捆绑软件,尽管如果我想要整个RxJs库,看起来很容易更改。
在我的问题中,不止一种方法可行。有些不会,有些不是由于Angular 2的缺陷而导致的。这是我目前正在使用的方法:
WebPack + require.js
angular2-webpack-config.js
var config = {
entry: {
app: inputFile
},
externals: [
/^@angular\//,
/^rxjs\//
],
output: {
libraryTarget: "amd",
path: __dirname,
filename: './' + outputName
},
plugins: [
new require('webpack').optimize.UglifyJsPlugin()
]
};
我仅externals
通过libraryTarget
(AMD / RequireJS,CommonJs / node,UMD)告诉它什么是什么以及什么伪标准机制将在运行时加载它们。我的设置只是导致将外部库引用包装在中define()
。
请注意,我对WebPack中的路径不做任何事情。在我的软件中,该node_modules
文件夹中的所有内容在内部和内部软件中都具有类似的引用机制。我的代码库和第三方库都希望在以下位置找到RxJS rxjs
(例如,而不是../rxjs
'node_modules / rxjs`)。在运行时,两者都需要进行映射,但是由于我们不允许WebPack进入第三方模块(我们使用的是预先构建的UMD),因此WebPack并不是进行映射的地方。它只会映射我的代码。相反,我们应该在运行时加载器中执行此操作:
index.htm
<script src="https://npmcdn.com/core-js/client/shim.min.js"></script>
<script src="https://npmcdn.com/[email protected]/dist/zone.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/reflect-metadata/0.1.3/Reflect.min.js"></script>
<script>
var require = (function(){
var versions = {
'router-deprecated': '@@2.0.0-rc.2',
'forms': '@@0.1.1',
'angular': '@@2.0.0-rc.4',
'rxjs': '@@5.0.0-beta.10'
}
var paths = {
'rxjs': "https://npmcdn.com/rxjs" + versions.rxjs + "/bundles/Rx.umd.min"
};
[
'core',
'http',
'common',
'compiler',
'platform-browser',
'router-deprecated',
'platform-browser-dynamic'
].forEach(function (submodule) {
var module = '@@angular/' + submodule
paths[module] = 'https://npmcdn.com/' + module + (versions[submodule] || versions.angular) + '/bundles/' + submodule + '.umd.min';
});
var rxmap = {};
[
'Rx',
'Observable',
'Subject',
'observable/PromiseObservable',
'operator/toPromise'
].forEach(function (submodule) {
rxmap['rxjs/' + submodule] = 'rxjs';
})
return {
paths: paths,
map: {
'*': rxmap
}
};
})();
</script>
<script data-main="../assets/compiled/a2.webpack.js" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.2.0/require.min.js"></script>
另外,由于如果您使用的是WebPack和UMD,则您可能会担心生成的文件大小和时间。此子应用程序的Angular 2构建过程从大约24秒缩短到1秒。它发布的更改大小从2MB以上增加到10万左右。
这是缓存的依赖项的线路负载大小,以供参考。奇怪的是,在UMD版本中,它们现在比集成的WebPack修剪的捆绑包的线径增加小几KB 。
KB
27.5 shim
6.8 zone
8.0 require
3.3 platform-browser-dynamic
36.8 http
8.7 core
20.8 common
16.5 router
98.5 compiler
27.9 platform-browser
39.0 Rx
显然,更新后我的公共站点加载时间大大减少了(从大约10到20秒减少到1秒),但是这些数字根据连接情况而变化很大。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句