Skip to main content

加载 JS

Babel

Webpack 默认处理 ES2015 模块并将其转换为代码,但它不会转换特定语法,例如 const。生成的代码可能会出现问题,尤其是在旧版浏览器中。

通过 Babel 编译代码可以解决这个问题,Babel 是一个支持 ES2015 + 语法的著名 JavaScript 编译器。类似于 ESLint,它建立在预设和插件之上。预设是插件的集合,你也可以定义自己的插件。

tip

鉴于扩展现有预设时的局限性,modify-babel-preset 允许你基于一个基本预设来进行灵活的扩展。

尽管 Babel 可以单独使用,但你也可以将它与 Webpack 连接起来。在开发过程中,如果你使用的浏览器支持的语言特性,则跳过处理。

如果你不依赖任何自定义语言特性并使用现代浏览器工作,则跳过处理是一个不错的选择。但是,在编译生产代码时,通过 Babel 处理几乎是必需的。

你可以通过 babel-loader 在 Webpack 中使用 babel。它可以获取项目级别的 Babel 配置,或者你可以在 webpack loader 本身进行配置。babel-webpack-plugin 是另一个鲜为人知的选择。

你可以使用 babel 来编译项目的 Webpack 配置。要实现此目的,请使用 webpack.config.babel.js 来命名 Webpack 配置。interpret 包使用了这种方式,它也支持其他编译器。

tip

如果你使用 webpack.config.babel.js,请注意设置 "modules": false。如果要使用 ES2015 模块语法,你可以跳过 Babel 全局配置中的设置,然后按照下面的讨论为每个环境进行单独配置。

Babel 中的关键配置:

  • plugins:babel 中使用的插件,这些插件可以控制如何转换代码
  • presets:babel 可以使用哪些新的语法特性,一个 presets 对一组新语法的特性提供了支持,多个 presets 可以叠加。presets 其实是一组 plugins 的集合,每个 plugin 完成一个新语法的转换工作。presets 是按照 ECMAScript 草案来组织的,通常可以分为三大类:

年度标准

  • ES2015 - 包含 2015 年加入的新特性
  • ES2016 - 包含 2016 年加入的新特性
  • ES2017 - 包含 2017 年加入的新特性
  • env - 包含当前所有 ECMAScript 标准的新特性

被社区提出未写入标准

  • stage0 一些 Babel 插件实现了对这些特性的支持,但是不确定是否会被定为标准
  • stage1 值得被纳入标准的特性
  • stage2 已被起草,将被纳入标准里
  • stage3 已定稿,各大浏览器厂商和 NodeJS 社区开始着手实现
  • stage4 在接下来一年会纳入标准

支持特定场景的语法特征

  • babel-plugin-react 支持 React 开发里的 JSX 语法
  • babel-plugin-import

下面列举几个关键的 Babel 依赖包:

  • @babel/preset-env:允许你为旧版浏览器支持某些语言特性。为此,你应该启用其 useBuiltIns 选项(设置 "useBuiltIns": true"useBuiltIns": "usage")并安装 @babel/polyfill。你必须通过 import 或 entry(app: ["@babel/polyfill", PATHS.app])将其包含在项目中。@babel/preset-env 根据你选定的浏览器重写导入,并仅加载所需要的 polyfill
  • @babel/polyfill:会在全局范围内提供了像 Promise、Set 这样的对象,这会污染全局作用域,对于一些库的开发者来说这可能会造成影响,这时候可以使用 `@babel/plugin-transform-runtime 。它可以作为 Babel 插件启用,避免了全局变量污染的问题。
  • babel-plugin-import:重写模块导入,以便你可以使用这样的形式(import { Button } from 'antd')来导入模块,而不必指出精准的路径
  • babel-plugin-import-asserts:用来断言导入的定义。
  • babel-plugin-jsdoc-to-assert:将 JSDoc 注释转换为可运行的断言。
  • babel-plugin-log-deprecated:如果函数注释中包含 @deprecate,就在函数中注入 console.warn。
  • babel-plugin-annotate-console-log:在使用 console.log 时,该插件会将有关调用上下文的信息一起打印,因此更容易看到打印时的位置。
  • babel-plugin-sitrep:记录函数中的所有赋值操作并打印它们。
  • babel-plugin-webpack-loaders:允许你通过 Babel 使用某些 Webpack loader。
  • babel-plugin-syntax-trailing-function-commas:为函数参数添加尾逗号语法支持。
  • babel-plugin-transform-react-remove-prop-types:允许你在生产环境中将 propType 相关的代码删除。
tip

可以通过 babel-registerbabel-cli 将 Babel 与 Node 连接起来。如果你想在不使用 Webpack 的情况下通过 Babel 编译代码,这些包会很方便。

设置 TypeScript

Microsoft 的 TypeScript 是一种需要编译的语言,遵循与 Babel 类似的设置。与 JavaScript 不同的是,它具备强类型。这样,一个好的 IDE 可以更好的提示,提高编码体验。强类型对于开发来说是很有意义的,因为它比较清晰地约束了变量的类型。

与 Facebook 的类型检查器 Flow 相比,TypeScript 是一种更安全的选择。因为,它的预定义类型比较多,总体上的维护质量也更好。

你可以使用以下 loader 将 TypeScript 与 Webpack 一起使用:

tip

ESLint 有一个 TypeScript 解析器。所以你可以直接通过 eslint 来 lint ts 代码。

参考资料

  1. Webpack Guidebook: 加载脚本, by tsejx