【问题标题】:webpack in production mode doesn't like let生产模式下的 webpack 不喜欢 let
【发布时间】:2018-02-24 21:18:14
【问题描述】:

免责声明:我主要不是网络开发人员,这是我第一次涉足节点、包、npm、umd、webpack 和捆绑的世界。

我有一个构建和运行良好的打字稿项目,当前配置为输出与 webpack 兼容的导出。我可以使用webpack 和下面的webpack.config.js 来成功构建和使用该应用程序就好了:

var path = require('path');

module.exports = {
    // entry: './scripts/stats.js',
    entry: './scripts/app.js',
    output: {
        // library: 'stats',
        path: path.resolve(__dirname, 'dist'),
        filename: 'stats.bundle.js'
    },
    node: {
      fs: 'empty'
    }
}

但是,如果我尝试使用 webpack -p 构建捆绑包,则会收到关于使用 let 而不是 var 声明的变量的意外标记的 Uglify 错误,如下所示:

ERROR in stats.bundle.js from UglifyJs
Unexpected token: name (results) [stats.bundle.js:47151,8]

有问题的行如下:

47149 function SelectNodes(filter) {                                                                                                                                  
47150     var nodes = [];                                                                                                                                          
47151     let results = document.querySelectorAll(filter);                                                                                                         
47152     for (let i = 0; i < results.length; ++i) {                                                                                                               
47153         nodes.push(results[i]);                                                                                                                              
47154     }                                                                                                                                                        
47155     return nodes;                                                                                                                                            
47156 }                               

let 替换为var 可以让事情顺利进行;但是在下次使用 let 时会引发另一个错误。

我没有使用 babel 或任何插件。在使用转译器等之前,我正在尝试让基本的 webpack 工作而没有任何插件或并发症。

推测这是一个问题,生产模式下的 webpack 不支持与常规模式下的 webpack 相同的 ES 标准,但我不确定为什么会有这样的差异。 (这是我使用所有 JS 工具的经验,构建工具链的质量无处不在,一切都在进行中,没有什么是标准化的。)

【问题讨论】:

    标签: webpack webpack-2


    【解决方案1】:

    你的假设是正确的。所以 webpack 不会将你的 ES6 代码转换为 ES5。它在开发中“有效”,因为大多数现代浏览器都支持 ES6 语法。所以你去浏览器检查你的工作,你的现代浏览器知道如何处理 ES6 语法。 Uglify 不理解 ES6(尽管作者几乎完成了支持 ES6 的新版本)。所以你需要通过一个加载器来运行你的代码,它将你的 ES6 代码分解为 ES5。大多数时候 babel-loader 都可以工作,但我对 typescript 的了解还不够,无法为您提供答案。如果您计划在未来更多地使用 webpack 自定义配置,我推荐 https://survivejs.com/webpack/preface/。这是我为深入 webpack 世界找到的最全面的资源;可能是因为它是由 webpacks 核心贡献者之一维护的。

    检查https://github.com/babel/babel-loader

    module: {
      rules: [
        {
          test: /\.js$/,
          exclude: /(node_modules|bower_components)/,
          use: {
            loader: 'babel-loader',
            options: {
              presets: ['env']
            }
          }
        }
      ]
    }
    

    【讨论】:

    • 感谢您的回答。我已经将我的打字稿转换为 JS(并且实际上可以将打字稿配置为发出 ES5 而不是 ES6),但我想我的问题是/是否有可能让 webpack 发出生产就绪的 ES6 代码(这是为了-house 应用程序,我们可以控制浏览器)。我猜答案是否定的,除非 UglifyJS 依赖可以配置/替换为其他东西。
    • Uglify 只会理解 ES5,目前,我相信维护者正在努力集成 ES6。因此,您要么必须放弃 Uglify 并使用另一个 uglifier/minifier,要么设置生产以输出 ES5,以便您可以使用 UglifyJS
    • 所以你是说可以让webpack -p使用不同的缩小器?
    • 是的!我推荐这个资源,它可以帮助你找到替代方案,它是一个很好的 webpack 资源,由 webpack 的主要贡献者之一维护。 survivejs.com/webpack/optimizing/minifying/…
    • 如果我对我有帮助,我将不胜感激,努力争取代表,这样我就可以做出更好的贡献!谢谢!祝您好运解决您的问题!
    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 2021-10-15
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多