本文目录:
- 1.babel是什么?
- 2.使用babel
- 3.babel插件
- 4.babel的preset
- 5.webpack和babel
- 6.优化babel-loader
1.babel是什么?
Babel 是一个 JavaScript 编译器,它使用非常广泛,可以将es6转换成es5,从而在一些不支持es6的
浏览器中运行,这意味着你写es6代码的时候就不需要去关心浏览器是否支持es6
2.使用babel
我们新建一个babel-demo的目录来演示babel的使用,进入到babel-demo目录后,运行命令初始化项目
npm init -y
这条命令的作用是在babel-demo目录下生成一个package.json的文件
接下来,我们需要安装babel-cli
npm install --save-dev babel-cli
babel-cli是命令行工具,安装以后我们就可以在命令行中通过babel命令来转码
安装好后,我们写一段代码来测试一下babel的编译转码功能,在babel-demo目录下新建index.js文件,
编写下面代码:
() => console.log("hello nodeing.com")
接下来,通过babel命令去编译index.js
./node_modules/.bin/babel index.js
如果你不想每次运行babel的时候都输 ./node_modules/.bin/babel这么么一串命令, 你可以把这个命令配置到package.json中
{
"name": "babel-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "./node_modules/.bin/babel index.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"babel-cli": "^6.26.0"
}
}
这个时候,我们通过npm的命令来启动编译
"build": "./node_modules/.bin/babel index.js"是新增加的
npm run build
运行后的结果,原样输出了index.js中的内容,为什么babel并没有编译我们的index.js文件呢?
原因在于,babel是基于插件的,插件就是提供的一些扩展功能,如果没有告诉babel用哪个插件来做事情,那么babel就不会处理
3.babel插件
前面我们讲到,babel是基于插件的,做不同的事情需要不同的插件,这样让babel非常灵活并且强大
我们去找到transform-es2015-arrow-functions这个插件,点进去查看它的使用,这个插件的功能是帮助我们把es2015(es6)的箭头函数编译成es5代码
下面我们来安装这个插件
npm install --save-dev babel-plugin-transform-es2015-arrow-functions
安装好以后,我们需要在babel-demo目录下新建.babelrc文件,这个文件就是babel的配置文件,我们在这个配置文件中增加配置项
{
"plugins": [
"transform-es2015-arrow-functions"
]
}
然后,运行npm命令,查看效果
npm run build
运行结果:
(function () {
_newArrowCheck(this, _this);
return console.log(1);
}).bind(this);
接下来,我们去修改index.js 文件,增加其他的es6语法
() => console.log(1)
class demo{}
再去执行npm run build命令,得到的效果也是原样输出,这个原因和前面我们遇到的⼀样,它需要安装另一个插件才能让babel运作起来,要不然就什么都不做
npm install --save-dev babel-plugin-transform-es2015-classes
安装好后,同样需要去修改.babelrc文件,增加配置
{
"plugins": [
"transform-es2015-arrow-functions",
"transform-es2015-classes"
]
}
接下来就可以运行npm run build命令来查看效果了
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function"); } }
(function () {
return console.log(1);
});
let demo = function demo() {
_classCallCheck(this, demo);
};
以上就是babel的插件使用方法
4.babel的preset
通过插件的学习,我们知道了babel要去解析转换es6语法,需要安装对应的插件,我们只是使用到了两个es6的语法,就需要装两个插件,当我们需要使用很多es6语法的时候,那就需要装非常多的插件,这样显得非常麻烦,那么有没有简便点的方法呢?
babel通过preset来解决我们上面提出的问题,preset叫做预设,意思就是说预先设置一些常用的语法配置,把一批常用的相关的插件打包来满足我们的开发,例如:我们处理es6语法的时候,我们就把和es6相关的语法插件打包在一起,组成一个预设,这个预设叫做es2015,所以,当我们下载es2015这个预设的时候,本质上就是去下载一批和es6相关的语法插件,这样我们就不用每次去下载配置插件了
安装preset-es2015
npm install babel-preset-es2015 --save-dev
安装好后,需要去修改.babelrc配置文件
{
"presets": [
"es2015"
]
}
最后,通过npm run build命令,查看编译结果
装一个更全面的可以解析es2015,2016,2017...的预设
npm install babel-preset-env --save-dev
修改配置文件
{
"presets": [
"env"
]
}
5.webpack和babel
让我们把目录切换到webpack-demo,修改webpack-demo下的index.js加入下面一段es6代码
// 测试es6是否被编译成es5
()=>console.log("hello nodeing!!!")
然后运行命令查看结果
npm run dev
在打包出来的my-first-webpack.bundle.js文件中查看到,我们写的es6代码原样输出,webpack并没有把es6代码编译成es5要让es6代码被编译,我们需要借助babel的力量,这里我们需要安装babel-loader和babel-core以及处理es6语法的预设,babel-loader的作用就是将es6代码送给babel-core处理,babel-core就是babel工作的核心api
安装babel-core和babel-loader以及处理es6的预设
npm install babel-loader babel-core babel-preset-es2015 --save-dev
//es2015可以改为功能更齐全的env
在webpack-demo目录中新建.babelrc文件,增加babel配置
{
"presets": [
"es2015"
]
}
接下来需要在webpack.config.js文件中增加配置项
在rules规则数字中增加下⾯代码
{
test: /\.js$/,
use:['babel-loader']
}
运行npm run dev命令把index.js打包成my-first-webpack.bundle.js,在my-first-webpack.bundle.js中我们查看到,原来的es6代码已经成功转换成
es5代码了
// 测试es6是否被编译成es5
(function () {
return console.log("hello nodeing!!!");
});
6.优化babel-loader
当我们写这个正则表达式 (/.js$/) 的时候,表示所有js文件都会被送babel-loader加载,然后由babel-core处理一遍,这里包括我们安装的很多第三方包,你会发现node_modules文件夹下会有很多的js文件,但是这些js文件已经由开发者打包好了我们可以直接使用的,并不需要我们再去处理一遍,因此,如果babel-loader再去处理的话,会浪费太多的时间,导致webpack打包编译很慢,我们现在需要优化它。具体的做法是排除不需要再次编译的,让babel-loader只处理我们开发的源文件,因此,我们需要修改webpack.config.js中的配置
{
test: /\.js$/,
use:['babel-loader'],
exclude: path.resolve(__dirname, 'node_modules')
},
其中,exclude: path.resolve(__dirname, 'node_modules') 这条语句表示排除node_modules这个文件夹,因为这个文件夹下放的都是第三方包,并不需要我们再次勇babel去编译了
再次运行npm run dev去打包的时候会发现已经快很多了