与babel的"孽缘"

简介: Babel is a JavaScript compilerbabel主要的职责就是将一些前沿时髦的JS特性通过"翻译"用到老旧的‘宿主’环境里。(浏览器,Node等)


babel是什么鬼

Babel is a JavaScript compiler

babel主要的职责就是将一些前沿时髦的JS特性通过"翻译"用到老旧的‘宿主’环境里。(浏览器,Node等)

babel的正确打开方式

babel-cli

利用babel命令行工具来进行对应的文件进行"翻译"。

npm install --save-dev babel-cli 
复制代码

可以在CLI中直接将指定的文件进行编译。

babel script.js
复制代码

.babelrc

.babelrc又是什么东东

如果一个项目中需要用到babel打包工具,此时.babelrc就是存放在项目根目录下的babel的配置文件。 这种方式用于前端项目自己维护webpack/webpackDevServer。(这个文件是为前端服务器使用的)

e.g.

webpack配置文件中获取babel的配置信息。(下面的配置文件有省略)

// 引入babel文件,对react项目进行运行时监测
var babelrc = fs.readFileSync('./.babelrc');
module.exports = {
devtool:{},
context:{},
entry:{},
output:{},
 module: {
    loaders: [
      { test: /\.jsx?$/, exclude: /node_modules/, loaders: ['babel?' + JSON.stringify(babelrc),]}]
      }
复制代码

package.json

在对应的项目的package.json的babel中指定对应的babel配置信息。

"babel": {
    "presets": [
      "react-app"
    ]
  },
复制代码

配置规格和.babelrc是一样的

常用参数

env

使用env来对指定的环境配置转码规格。

{
  "env": {
   "development": {
      "plugins": [
        "typecheck",
        ["react-transform", {
            "transforms": [{
                "transform": "react-transform-catch-errors",
                "imports": ["react", "redbox-react"]
              }
            ]
        }]
      ]
    },
    "production": {  
        "plugins": ["transform-react-constant-elements"]
    }
  }
}
复制代码

该参数一般都是指定类似于catch-errors这类的plugins。

变量的使用

该变量会被WebpackDevServer的配置文件获取,从而根据production或者development来定义WebpackDevServer的行为。

presets

presets用来定义转码规则。

"presets": ["react", "es2015", "stage-0"]
复制代码

或者按照官方的推荐的一种一劳永逸的方法

npm install babel-preset-env --save-dev
//.babelrc中配置
{
  "presets": ["env"]
}
复制代码

Without any configuration options, babel-preset-env behaves exactly the same as babel-preset-latest (or babel-preset-es2015, babel-preset-es2016, and babel-preset-es2017 together).

有时候需要根据宿主环境的不同,来决定是否采用转码。所以需要额外的指定target

{
  "presets": [
    ["env", {
      "targets": {
        "browsers": ["last 2 versions", "safari >= 7"]
        //这里也可以指定Node的信息
        //"node": "6.10"
      }
    }]
  ]
}
复制代码

plugins

来配置一些插件用于babel的transform阶段来使用。 所以在plugins中常见得plugins都是带transform前缀的。

"plugins": [
        "transform-runtime",
        "transform-class-properties",
        "syntax-object-rest-spread"
    ]
复制代码

这里需要额外的提示一下transform-runtime。在定义公共库的时候,很有用。

babel的底层知识

Babel在转码的过程中也会存在"生命周期"。parsing/transforming/generation。 或者说编译器都存在这个三个周期。 如何实现一个编译器了解一下

相关文章
|
JavaScript 编译器
模块 ""element-plus"" 没有导出的成员 "ElMessage"。你是想改用 "import ElMessage from "element-plus"" 吗?
模块 ""element-plus"" 没有导出的成员 "ElMessage"。你是想改用 "import ElMessage from "element-plus"" 吗?
386 0
|
自然语言处理
合同结构化文书解析失败,请联系管理员排查:{"code":3001,"message":"File transform error","success":false,"tracerId":"requestId"}报错处理
在使用自然语言处理自学习平台时,标注任务需要上传标注数据,但是使用doc格式上传文件后开始标注时出现了此提示,此篇文章简单介绍下此问题的处理方式。
736 0
合同结构化文书解析失败,请联系管理员排查:{"code":3001,"message":"File transform error","success":false,"tracerId":"requestId"}报错处理
|
云计算
超炫酷!看阿里云渲染如何打造"小门神"
 本文讲的是超炫酷!看阿里云渲染如何打造"小门神"【IT168 评论】12月29日,由阿里影业参与投资的国产3D动画电影《小门神》在全国拉开点映大幕。点映结束后,《小门神》口碑在各大社交网络迅速发酵,而“国产动画电影为什么能做得这么高端”则成了不少观众讨论的焦点。
2803 0
|
Java Android开发
"XX cannot be resolved to a type "eclipse报错及解决说明
<p>转自:<a target="_blank" href="http://zhaoningbo.iteye.com/blog/1137215">http://zhaoningbo.iteye.com/blog/1137215</a></p> <p><span style="font-family:Helvetica,Tahoma,Arial,sans-serif; font-size:
1603 0
|
数据库 .NET 开发框架
关于&lt;%# Eval(&quot;createTime&quot;%&gt;的时间格式转换
出现问题: 在ASP.NET中,前台页面在调用后台数据库时间时,使用&lt;%# Eval("createTime"%&gt;,发现时间显示的是数据库的时间类型"2015/10/29 13:40:01",想要改成"2015-10-29"的时间显示类型。 解决方法: 在&lt;%# Eval("createTime"%&gt;里添加格式样式,修改后如下: &lt;%# Eval("c
1376 0
&quot;catalog&quot; 与 &quot;category&quot; 的区别
catalog 中文翻译为: 目录; category 中文翻译为: 类别; catalog 是有一定顺序的条目(item)列表,或者是分类系统列表。 还可以用作动词,表示编目,将条目放置到某个目录下。
1639 0
|
Java API 前端开发
正确使用Class.getResourceAsStream(&quot;&quot;)与Class.getClassLoader().getResourceAsStream(&quot;&quot;)
方法getResourceAsStream("")与getResource("")均常被用于获取编译路径下指定的配置文件,用法相似,下面以getResource("")为例展示其正确用法: /** * 无package */ System.out.println(this.getClass().getResource("template.xml").getPath()
1842 0
|
敏捷开发 移动开发 JavaScript
KeyboardJS - &quot;构建你的应用吧,我会处理按键&quot;
KeyboardJS  - "构建你的应用吧,我会处理按键" 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循“署名-非商业用途-保持一致”创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。
956 0