【发布时间】:2020-12-24 19:35:16
【问题描述】:
我有以下文件:
src/index.js
let foo = null ?? "waffles"
以及以下 webpack 配置:
import path from 'path'
const defaultConf = {
name: 'default',
entry: './src/index.js',
output: {
filename: 'main.js',
path: path.resolve(__dirname, 'dist')
}
}
export default defaultConf
构建失败:
ERROR in ./src/index.js 2:18
Module parse failed: Unexpected token (2:18)
环境是:
node v14.8.0webpack@4.44.1
为什么我的构建失败了?
如何调试导致它失败的原因?
我该如何解决?
编辑:所述语法是supported by node(+所有主要浏览器)。期望构建会成功。
编辑:根据安东尼的回答,我可以让问题更具体:
- 显然,根据答案,wepback 正在尝试转换该代码。 为什么 webpack 会尝试转译该代码? 它是否在某些我不知道的默认值上运行?什么是默认值?
- 如果我被一些默认设置绊倒了,我怎样才能知道它是什么? Webpack docs 说如下:
开箱即用,webpack 不需要您使用配置文件。但是,它将假定您的项目的入口点是
src/index.js,并将在dist/main.js中输出结果,并针对生产进行了缩小和优化。
它还做了哪些其他假设?“优化”是什么意思?它如何缩小代码?如何检查默认配置?可能调试构建过程(即逐步调试)?
- 如何防止 webpack 尝试转译此代码? 如何设置语言级别?例如。到 es2020,其中无效合并是其中的一部分。
注意:这个问题的重点不是最终得到一段工作代码。如果我想要,我会做 foo = null ? null : "waffles" 而不是空合并。重点是揭开 webpack 的神秘面纱。
【问题讨论】:
-
webpack说它可以选择es6的模块语法样式,但它没有说esnext这意味着它不支持es2020语法:) -
我已经更新了我的答案。除非有严格的要求,否则我认为在 webpack 中使用 es5 语法并指示 webpack 使用 babel-loader 转译您的代码是可行的方法。还要确保你的 webpack 配置正在被使用。
-
经过一些研究,我有了一个有根据的猜测。它仍然是猜想。默认情况下,Webpack 可能不会转译代码,但它会转换代码,因此需要了解它及其语法。 v4 不理解新的 ES 功能,但是 v5 开箱即用。为什么它需要理解它的一个例子是 prod 的代码优化。它将这个:
let foo = null ?? "waffles"; console.log(foo)转换为console.log("waffles")- 它需要了解运算符的功能才能将其缩减为更短的版本。优化器在这方面实际上相当聪明。