【问题标题】:ng serve --prod for ng-cli results in UglifyJs SyntaxError: Unexpected token: nameng serve --prod for ng-cli 导致 UglifyJs SyntaxError: Unexpected token: name
【发布时间】:2017-06-11 10:22:56
【问题描述】:

我在我的项目中使用Angular-CLI (ng-cli)。当我输入ng serve 时,应用程序就会运行。但是,当我输入ng serve --prod 时,出现以下错误。

来自 UglifyJs 的 vendor.bundle.js 中的错误 SyntaxError: Unexpected token: name (IdUtil) [./~/my-lib/dist/src/common/util.js:7,0][vendor.bundle.js:9318,6]

a known issue that UglifyJs cannot parse ES6

此外,这些 SO 帖子(herehere)建议将 tsconfig.json 更改为目标 es5。我不清楚的是它们是指消费 Angular 项目的 tsconfig.json 还是用于生成库的项目。无论如何,我的 Angular 项目的tsconfig.json 已经针对es5。如下所示。

{
  "compilerOptions": {
    "declaration": false,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "lib": ["es6", "dom"],
    "mapRoot": "./",
    "module": "es6",
    "moduleResolution": "node",
    "outDir": "../dist/out-tsc",
    "sourceMap": true,
    "target": "es5",
    "typeRoots": [
      "../node_modules/@types"
    ]
  }
}

导入到 Angular 项目中的库的tsconfig.json 如下所示,它的目标不是es5,而是es6。顺便说一句,我不能简单地将这个库中的开关从es6 切换回es5(我刚刚尝试过),因为我正在使用es6 类,如SetMap(这些类的使用是如此严重,以至于至少可以说更改它们并非易事;如果我知道所有这些,我会选择完全避免使用 es6 功能)。

{
    "compilerOptions": {
        "noImplicitAny": true,
        "target": "es6",
        "module": "commonjs",
        "alwaysStrict": true,
        "diagnostics": false,
        "listEmittedFiles": false,
        "listFiles": false,
        "pretty": true,
        "declaration": true
    }
}

这是我的问题。

  • 在使用ng serve --prod 时如何使用Angular-CLI 禁用丑化?
  • 是我的 Angular 项目的 es5/es6 目标还是导入的库有问题?
  • SO 帖子似乎暗示我可以在 Angular-CLI 通过 UglifyJs for ng serve --prod 之前通过 babel(我以前从未使用过)预处理导入的库。此程序是否记录在案?如果是这样,请让我知道如何执行此操作。 angular-cli.json 是我了解配置 ng-cli 的地方。如果这个建议是真的,我无法确定如何挂钩 babel 预处理。

【问题讨论】:

  • 仅供参考,我的解决方法是从 TS -> ES6 -> (babel) -> ES5 编译我的外部库。这是我现在唯一的方法。
  • 将 ES6 转换为 ES5 会显着增加构建时间,请参阅下面的答案。希望对您有所帮助...
  • @JaneWayne 你是如何在 (babel) 步骤中添加的?

标签: angular ecmascript-6 babeljs angular-cli uglifyjs


【解决方案1】:

ng serve 命令专为在开发环境中工作而设计。

尝试运行:

ng build --prod

如果您使用 IE 测试您的应用:

运行命令

npm install -dev angular2-ie9-shims

而且你必须添加 angular-cli.json

"scripts": [
    "../node_modules/angular2-ie9-shims/shims_for_IE@2.1.2.js",
    "../node_modules/angular2-ie9-shims/shims_for_IE@2.0.0-beta.17.js",
    "../node_modules/angular2-ie9-shims/shims_for_IE.dev.js"
  ],

或者只是在 index.html 中添加

<script src="https://raw.githubusercontent.com/angular/angular/66df335998d097fa8fe46dec41f1183737332021/shims_for_IE.js" type="text/plain"></script>

【讨论】:

  • 我实际上是在 Mac 上。
【解决方案2】:

您可以使用一些技巧来处理 ES6/ES2015 缩小。

你可以使用 uglifyjs-webpack-plugin by bebraw - 它将 UglifyJs 与 webpack 分离。用法如下:

const UglifyJSPlugin = require('uglifyjs-webpack-plugin');

module.exports = {
    entry: {...},
    output: {...},
    module: {...},
    plugins: [
        new UglifyJSPlugin()
    ]
};

然后,您必须将 package.json 中的 uglify-js 引用替换为以下内容:

"uglify-js": "git+https://github.com/mishoo/UglifyJS2.git#harmony",

【讨论】:

  • 太好了,这解决了问题!
  • 这个解决方案在 angular-cli 环境中并不容易工作,其中 webpack 配置发生在幕后。
  • 实际上 cli 是最实用的工作方式,但恐怕你必须切换到手动提供构建配置:(
  • 最后一行进入 package.json
【解决方案3】:

我遇到的问题是来自 Google 的名为 Autotrack 的 NPM 模块。该包在 ES6 中,它是一个 .js 文件,因此 Typescript 没有对其进行转译。我必须手动包含一个 ES5 版本的 Autotrack 才能使 uglify 工作。

【讨论】:

  • 我通过在 dist 文件夹中的 vendor.js 文件中搜索 uglify 抱怨的变量名,发现它是 Autotrack。
  • 您能否更详细地解释一下您是如何将它们包含在内的?
  • 我从 GitHub 下载了 ES5 源代码并在 script 标签中手动引用了 .js 文件 - 然后从 package.json 中删除了 Autotrack 引用
  • 对我来说,我只使用 import 'autotrack/autotrack.js';.. 这将添加所有插件,但构建时的文件大小差异仅为 0.02kb .. 我可以忍受:P
猜你喜欢
  • 2018-02-07
  • 2019-11-08
  • 2019-06-16
  • 2020-06-02
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
相关资源
最近更新 更多