使用Google Closure Compiler,webpack和Firebase JS SDK编译js时出现JSC_NON_GLOBAL_DEFINE_INIT_ERROR

时间:2017-09-12 04:20:22

标签: javascript node.js firebase webpack google-closure-compiler

使用以下工具编译js时出现

JSC_NON_GLOBAL_DEFINE_INIT_ERROR:

  • webpack:3.5.6
  • Google Closure Compiler JS:20170806.0.0
  • Firebase JS SDK:4.3.1

环境

  • MacOS X:10.11.6
  • node.js:v7.10.0
  • npm:4.2.0

以下是错误消息:

ERROR in app.bundle.js:5325 (JSC_NON_GLOBAL_DEFINE_INIT_ERROR) @define variable  assignment must be global

使用如下的webpack.config.js:

module.exports = {
  plugins: [
    new ClosureCompiler({
      options: {
        languageIn: 'ECMASCRIPT6',
        languageOut: 'ECMASCRIPT3',
        compilationLevel: 'SIMPLE_OPTIMIZATIONS',
        warningLevel: 'QUIET'
      }
    })
  ]

此错误是由firebase/utils/constants.js内的@define注释引起的。

var CONSTANTS = exports.CONSTANTS = {
  /**
   * @define {boolean} Whether this is the client Node.js SDK.
   */
  NODE_CLIENT: false,
  /**
   * @define {boolean} Whether this is the Admin Node.js SDK.
   */
  NODE_ADMIN: false,
  /**
   * Firebase SDK Version
   */
  SDK_VERSION: '4.3.1'
};

我不确定Firebase使用@define注释的原因,但我决定使用UglifyjsWebpackPlugin作为暂定措施。

module.exports = {
  plugins: [
    new UglifyJSPlugin({
      output: {
        comments: false
      }
    }),
    new ClosureCompiler({
      options: {
        languageIn: 'ECMASCRIPT6',
        languageOut: 'ECMASCRIPT3',
        compilationLevel: 'SIMPLE_OPTIMIZATIONS',
        warningLevel: 'QUIET'
      }
    })
  ]

幸运的是UglifyjsWebpackPlugin似乎解决了这个问题。

我的问题是,

  • 有谁知道更好的方法来解决这个问题?
  • 您认为有任何不良副作用吗?

1 个答案:

答案 0 :(得分:0)

@define注释必须是全局的。在webpack中,一切都是模块,因此它不是全局的。

最佳选择可能是编写一个删除该注释的自定义加载程序。