Angular 2 使用 CLI - 为生产构建

Angular 2 with CLI - build for production

我刚刚安装了 angular-cli 1.0.0.beta.17(最新的),开始新项目,能够在端口 4200 上毫无问题地服务项目 - 只是标准 "app works!" 消息.

但是,当我尝试使用命令 ng build --prod 为生产构建这个空的通用应用程序时,我根本没有创建 main.*.js 文件,并且有一些警告屏幕,例如:

这是一个全新的空项目 - 我还没有机会破坏任何东西...

如何构建生产版本?

试试这个

 ng build --env=prod

构建系统默认使用 environment.ts 的开发环境,但如果您使用 ng build --env=prod,则将使用 environment.prod.ts

示例结果,如果您的项目是新的 angular cli 应用程序。

 10% building mod3439ms building modules                                                                     1ms add01564ms 917ms asset45ms emittingHash: 9216e76d6f10637c945c                  
Version: webpack 2.1.0-beta.22
Time: 6358ms
            Asset       Size  Chunks             Chunk Names
   main.bundle.js     2.6 MB    0, 2  [emitted]  main
 styles.bundle.js    10.2 kB    1, 2  [emitted]  styles
        inline.js    5.53 kB       2  [emitted]  inline
         main.map    2.61 MB    0, 2  [emitted]  main
       styles.map    14.2 kB    1, 2  [emitted]  styles
       inline.map    5.59 kB       2  [emitted]  inline
       index.html  482 bytes          [emitted]  
assets/.npmignore    0 bytes          [emitted]  
chunk    {0} main.bundle.js, main.map (main) 2.06 MB {1} [initial] [rendered]
chunk    {1} styles.bundle.js, styles.map (styles) 9.96 kB {2} [initial] [rendered]
chunk    {2} inline.js, inline.map (inline) 0 bytes [entry] [rendered]
Child html-webpack-plugin for "index.html":
         Asset     Size  Chunks       Chunk Names
    index.html  2.82 kB       0       
    chunk    {0} index.html 350 bytes [entry] [rendered]

完成,它位于 /dist 下,除非您在 angular-cli.json

中更改了 outDir

这些是来自您的 java 脚本源代码或您在 project.For 中使用的第三方库的 uglify js 警告,现在您可以忽略它们。

Angular cli 团队正在努力为产品构建抑制这种情况 https://github.com/angular/angular-cli/pull/1609

尝试使用:ng build --target=production 这应该有效。

使用 cli 版本 (1.0.1) 使用:

ng build --prod

这将为您提供带有 index.html 的 dist 文件夹和所有已准备好用于生产的捆绑 js 文件。

更新为 Angular v6+

# Prod - these are equivalent
ng build --configuration=production
ng build --c=production
ng build --prod=true

# Dev - and so are these
ng build --configuration=development
ng build --c=development
ng build --prod=false
ng build

这里有更多标志设置

https://angular.io/cli/build


根据 Angular-cli 的 github wiki v2+,这些是启动开发和生产构建的最常用方法

# Prod these are equivalent
ng build --target=production --environment=prod
ng build --prod --env=prod
ng build --prod

# Dev and so are these
ng build --target=development --environment=dev
ng build --dev --env=dev
ng build --dev
ng build

有不同的默认标志会影响 --dev 与 --prod 构建。

Flag                 --dev      --prod
--aot                false      true
--environment        dev        prod
--output-hashing     media      all
--sourcemaps         true       false
--extract-css        false      true

--prod 还设置了以下不可标记的设置:

  • 如果在 .angular-cli.json 中配置,则添加 service worker。
  • production 替换模块中的 process.env.NODE_ENV 值(这对于某些库是必需的,比如 React)。
  • 在代码上运行 UglifyJS。

为了使 AOT 正常工作,我需要进行一些故障排除。当我 运行:

ng build --prod --aot=false

我会 return 得到类似于

的错误
Module not found: Error: Can't resolve './$$_gendir/app/app.module.ngfactory'

最初,我必须进行一些项目重构才能让 AOT 工作。但是,如果您遇到此错误,它们可能是一种修复方法。尝试

npm i enhanced-resolve@3.3.0

https://github.com/angular/angular-cli/issues/7113

AOT是否实现。

如果实现了 Aot :

ng build --prod

如果未实现 Aot :

ng build --prod --aot=false

您必须更新最新版本 angular-cli、打字稿。 如果你使用命令:

ng build --prod --aot=false

你的项目编译JIT编译,如果你使用angular-cli一定可以工作。

如果你想用命令构建

ng build --prod --aot=true

那就是AOT编译,你必须更新main.ts文件为:

import { enableProdMode } from '@angular/core';
import { platformBrowser }    from '@angular/platform-browser';

import { AppModule } from './app/app.module';
import { environment } from './environments/environment';

if (environment.production) {
  enableProdMode();
}

platformBrowser().bootstrapModuleFactory(AppModule);

您需要 AOT,这通过使用 -prod 开关来暗示。不幸的是,当 Angular CLI 本身崩溃时,错误消息没有帮助。我是这样解决的:

npm install enhanced-resolve@3.3.0

我在这个页面的很长很长的地方找到了解决方案:https://github.com/angular/angular-cli/issues/7113

我看到有人提到将 Angular CLI 版本至少更新到 1.2.6。也解决了这个问题,但还没有测试它。

有很多命令可以使用 angular cli 将 angular 应用程序构建到生产模式。

ng build --env=prod

在 cmd 上执行此命令后,将创建默认文件夹,其中将包含与产品构建相关的所有缩小文件,但不会在 index.html 中设置基本路径。 要更改 index.html 要么去手动更改,例如添加 (.) 即

<base href="./">

您还可以在生产模式下使用 angular/CLI 命令构建代码时传递参数。

ng build --base-href=./ --env=prod

还有其他命令可以构建,例如传递 AOT 和构建优化器(以减少包大小)。

ng build --prod --build-optimizer

如果您想在构建后更改默认文件夹名称 (dist),则可以更改 .angular-cli.json 中的 outDir 值。