You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@babel/preset-env is a smart preset that allows you to use the latest JavaScript without needing to micromanage which syntax transforms (and optionally, browser polyfills) are needed by your target environment(s). This both makes your life easier and JavaScript bundles smaller!
babel 相关的一些配置
@babel/preset-env
targets
简单讲,该参数决定了我们项目需要适配到的环境,比如可以申明适配到的浏览器版本,这样 babel 会根据浏览器的支持情况自动引入所需要的 polyfill
通常情况下我们会使用
.browserslistrc
来声明需要适配的浏览器版本useBuiltIns
这个 option 用来配置@babel/preset-env 如何来处理 polyfills 的引入
false
默认值
不会引入 polyfill,你需要再文件入口处显示的引入@babel/polyfill,但是这种方式在[email protected]后被废弃了,官方推荐使用 core-js 配合 corejs 选项来使用 polyfill
entry
在入口文件处引入 corejs,babel 会根据 targets 或者 browserslistrc 来引入所有的需要的 corejs 的 polyfill
上面这种情况
import 'core-js'
,会引入所有的 polyfill(不管你有没有使用),当然你也可以根据自己的需要单独引入一些 corejs 的 polyfillusage
针对文件使用的 API 和 target 或者 browserslistrc 来注入 polyfill
corejs
支持两种配置方法
默认情况下,只会为 stable 的 ECMAScript 打上 polyfill,如果需要为 proposals 阶段的 api 打上 polyfill 则需要配置 proposals 为 true,corejs-api
对于 useBuiltIns 的值为 entry 的情况下,可以手动引入 proposals 的 corejs,针对 useBuiltIns 的值为 usage 的情况将 proposals 配置为 true 即可
proposals 为 true
proposals 为 false
总结一下@babel/preset-env 的配置
useBuiltIns:usage
,来减轻引入的 polyfill 的体积@babel/preset-react
runtime
当开启时会引入工具函数,有两个值
classic
、automatic
,默认值为 classicclassic
automatic
通篇看了一下文档,感觉用默认配置就行了
@babel/plugin-transform-runtime
A plugin that enables the re-use of Babel's injected helper code to save on codesize
可以解决什么问题
@babel/preset-env
注入的 polyfill 会污染全局环境,在开发 web 应用时无伤大雅,但是在开发第三方库时,却有可能污染使用方的全局环境,配置@babel/plugin-transform-runtime 的 corejs 这个 option 后,会将 corejs 的 polyfill 替换为具有作用域的 polyfill当未使用@babel/plugin-transform-runtime 时
当使用@babel/plugin-transform-runtime 时
corejs
配置是否开启 polyfill
npm install --save @babel/runtime
npm install --save @babel/runtime-corejs2
npm install --save @babel/runtime-corejs3
未配置 corejs
配置 corejs
可以看出使用了@babel/plugin-transform-runtime 时
babel-plugin-react-css-modules
在编译阶段将 react 中的 styleName 属性替换为 className
当我们在 react 中使用 css-modules 时有如下问题
<div className={Styles.appTitle}/>
或者<div className={Styles["app_title"]}/>
<div className={\
globalcls\ ${{Styles.appTitle}}}/>
使用 babel-plugin-react-css-modules 就解决了这个问题
<div className='global-css' styleName='local-module'></div>
支持 less
安装 postcss-less 后增加配置,postcss-less 只是用来支持 less 语法而不会将 less 编译为 css,编译的工作还是会交给 less-loader 来做
generateScopedName
用以生成 css-modules 的 ident 标识,如果使用了这个字段,则需要配置相应的 css-loader 的 option 以保证 css-loader 生成的 ident 标识和 babel-plugin-react-css-modules 生成的 ident 标识保持一致
详情请查看这个issue
autoResolveMultipleImports
如果 styleName 使用的类名是非重复的的则允许多个匿名引入,默认是 false
当开启这个配置
当 app.less 和 app2.less 没有同时包含
app_title
这个类名时不会报错,而当同时包含时则会报错The text was updated successfully, but these errors were encountered: