使用UMD捆绑包捆绑Angular 2应用程序(不构建供应商捆绑包)

香农

我目前将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>
  • 当我只是让WebPack做事时,该程序包运行良好,但只有几个MB,因为它没有利用预构建的包或单独的Angular 2“供应商”代码。
  • 当我使用Angular 2 WebPack Recommendations时,例如:plugins: [ new webpack.optimize.CommonsChunkPlugin("vendor", "vendor.bundle.js") ],我的应用程序包很小,但是每次构建时,我都会手动构建一个单独的,唯一的1MB包,其中包含大多数Angular 2框架。根据我的应用程序,此文件的每个内部版本都会稍有变化,并且在我的应用程序版本或各种应用程序之间不具有可移植性,并且没有“ CDN”的好处。当然,我必须包含此文件才能运行我的应用程序。
  • 当我使用IgnorePlugin进行过滤时@angular|rxjs,例如plugins: [ new webpack.IgnorePlugin(/\@angular|rxjs/) ],它会排除供应商文件,但会插入硬编码的异常,并在应用程序包的顶部抛出错误。
  • 当我使用WebPack externals时,例如externals: ['@angular/core', ...,我function(module, exports) { module.exports = @angular/core; },在我的应用程序包中获得输出,这显然不起作用。WebPack文档不是非常有用,但是我认为我可以指定一个libraryTarget或引用的resolve函数,该函数将指示WebPack在模块加载时进行编译。
  • 当我完全放弃WebPack并改用TypeScript编译器捆绑程序(按照使用UMD捆绑包的本指南)时,我得到了System.register()指向我期望的NPM命名空间的调用,例如System.register("myapp/boot", ['@angular/core', ...,但是我仍在SystemJS配置上进行调用UMD。附带说明,相对于WebPack生成的文件,此文件的大小要多25%。
  • 如果像上一个项目中那样使用SystemJS,则希望此编译在生成过程中进行,或者作为并行过程进行,而不是作为文件保存的一部分进行。我猜SystemJS-Builder(请参阅此处此处的相关问题)将是做到这一点的方法?也许这也会产生比Typescript集成的“ bundler”小的文件大小。

如何构建不依赖于唯一重新包装的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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在供应商捆绑包中注册捆绑包

来自分类Dev

供应商捆绑包加载失败

来自分类Dev

Rails 5 不使用来自供应商/捆绑包的捆绑包

来自分类Dev

Angular 2捆绑包

来自分类Dev

如何在Symfony2中使用供应商捆绑包资源

来自分类Dev

将捆绑包从供应商移动到src目录

来自分类Dev

gem安装在捆绑包文件夹(供应商/捆绑包)上

来自分类Dev

宝石安装在Rails应用程序本地测试中的供应商/捆绑下

来自分类Dev

Symfony2-创建自己的供应商捆绑包-项目和git策略

来自分类Dev

在symfony2中创建供应商捆绑包,并通过composer进行部署

来自分类Dev

如何使用最新的Browserify(6.xx)创建供应商捆绑包?

来自分类Dev

如何使用Gulp与Bower组件的Browserify创建单独的供应商捆绑包

来自分类Dev

Symfony 4:将供应商捆绑包作为“自己的捆绑包”来开发它的简单方法?

来自分类Dev

在构建供应商捆绑包时,将超级测试添加到Aurelia会导致错误

来自分类Dev

如何强制webpack加载库的umd捆绑包

来自分类Dev

对图像使用单独的捆绑包

来自分类Dev

为什么Bundle Install在供应商/捆绑包中安装gems?

来自分类Dev

Symfony 4-供应商捆绑包找不到带标签的自动接线服务

来自分类Dev

将特定的 ruby 版本安装到供应商/捆绑包中?

来自分类Dev

配置Aurelia CLI以从子文件夹提供应用程序捆绑包

来自分类Dev

Qt Mac应用程序无法创建独立的应用程序捆绑包(Qt Creator构建)

来自分类Dev

如何使用供应商/捆绑目录中安装的宝石

来自分类Dev

在哪里放置应用程序捆绑包?

来自分类Dev

Mac应用程序捆绑包能够启动多个实例

来自分类Dev

限制启动服务注册应用程序捆绑包

来自分类Dev

段中的应用程序捆绑包名称

来自分类Dev

多个Angular2应用程序,单个供应商存储库

来自分类Dev

多个Angular2应用程序,单个供应商存储库

来自分类Dev

通过 Webpack 创建带有散列的供应商包并在同构应用程序中使用它

Related 相关文章

  1. 1

    在供应商捆绑包中注册捆绑包

  2. 2

    供应商捆绑包加载失败

  3. 3

    Rails 5 不使用来自供应商/捆绑包的捆绑包

  4. 4

    Angular 2捆绑包

  5. 5

    如何在Symfony2中使用供应商捆绑包资源

  6. 6

    将捆绑包从供应商移动到src目录

  7. 7

    gem安装在捆绑包文件夹(供应商/捆绑包)上

  8. 8

    宝石安装在Rails应用程序本地测试中的供应商/捆绑下

  9. 9

    Symfony2-创建自己的供应商捆绑包-项目和git策略

  10. 10

    在symfony2中创建供应商捆绑包,并通过composer进行部署

  11. 11

    如何使用最新的Browserify(6.xx)创建供应商捆绑包?

  12. 12

    如何使用Gulp与Bower组件的Browserify创建单独的供应商捆绑包

  13. 13

    Symfony 4:将供应商捆绑包作为“自己的捆绑包”来开发它的简单方法?

  14. 14

    在构建供应商捆绑包时,将超级测试添加到Aurelia会导致错误

  15. 15

    如何强制webpack加载库的umd捆绑包

  16. 16

    对图像使用单独的捆绑包

  17. 17

    为什么Bundle Install在供应商/捆绑包中安装gems?

  18. 18

    Symfony 4-供应商捆绑包找不到带标签的自动接线服务

  19. 19

    将特定的 ruby 版本安装到供应商/捆绑包中?

  20. 20

    配置Aurelia CLI以从子文件夹提供应用程序捆绑包

  21. 21

    Qt Mac应用程序无法创建独立的应用程序捆绑包(Qt Creator构建)

  22. 22

    如何使用供应商/捆绑目录中安装的宝石

  23. 23

    在哪里放置应用程序捆绑包?

  24. 24

    Mac应用程序捆绑包能够启动多个实例

  25. 25

    限制启动服务注册应用程序捆绑包

  26. 26

    段中的应用程序捆绑包名称

  27. 27

    多个Angular2应用程序,单个供应商存储库

  28. 28

    多个Angular2应用程序,单个供应商存储库

  29. 29

    通过 Webpack 创建带有散列的供应商包并在同构应用程序中使用它

热门标签

归档