生产模式下的 webpack 不喜欢 let

webpack in production mode doesn't like let

免责声明:我主要不是网络开发人员,这是我第一次涉足节点、包、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 不会将您的 ES6 代码转换为 ES5。它 "works" 正在开发中,因为大多数现代浏览器都支持 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']
        }
      }
    }
  ]
}