美文网首页
webpack学习笔记二,关于babel

webpack学习笔记二,关于babel

作者: 人话博客 | 来源:发表于2019-02-22 01:53 被阅读0次

很多文章都告诉我

babel的作用是将ES6的语法转换为ES5.

原因是很多浏览器现在目前还不支持ES6的语法.
我们最终的代码是被webpack打包成一个js文件,并运行在浏览器中的.
如果不将ES6的代码编译成ES5,那么在某些浏览器就无法正常运行我们的代码了.

道理谁都清楚,但是看不到配置babel之后的前后变化,心里还是有点小堵.


先不用babel插件,来编译ES6的代码.

有一个 arrowFn.js 的文件.


export default () => {
  console.log('这是 es6 语法新增的箭头函数,在不支持es5的浏览器中,可能会出现无法执行的情况.')
}

在此代码中,export default & ()=> 都是属于 ES6 新增的语法.

index.js

import arrFn from './arrowFn'

arrFn()

这里的 import xxx from xxx 也是 ES6 中的语法.

现在先不配置 babel-loader,直接用 webpack 打包,看一下结果.

直接在终端运行

webpack index.js index.bundle.js

查看结果:

webpack仅仅只是打包而已

发现仍然是 ES6 的箭头函数.
这说明:webpack本身没有将ES6 -> ES5的能力.

webpack仅仅只是以一个.js文件为入口,处理之后所有木块之间的依赖关系,最终生成一个bundle.js 文件.仅此而已.

所以,es6->es5 就不能指望webpack,它也不是万能的.


使用babel处理ES6 -> ES5 的转码.

首先安装 babel 一系列的插件

npm i --save-dev babel-core babel-loader babel-preset-env

为了保证之后看博客能够正确运行,贴出它们的版本号:

"devDependencies": {
    "babel-core": "^6.26.3",
    "babel-preset-env": "^1.7.0",
    "babel-loader": "^7.1.5"
  },
  • babel-core: babel 转移的核心模块
  • babel-preset-env : 解析es6的包
  • babel-loader: babel的loader包

然后在 webpack.config.js 里添加下面这段代码.

const path = require('path')

module.exports = {
  entry: path.join(__dirname, 'index.js'),
  output: {
    filename: 'bundle.js',
    path: path.join(__dirname, 'dist'),
  },
  // 这里是添加的代码
  module: {
    rules: [{
      test: /\.js$/, // 匹配后缀名为 .js 结尾的文件
      use: 'babel-loader', // 使用 babel-loader 去处理
      exclude: /node_modules/ // 排除.js文件路径中包含 node_moudles 的.js文件
    }]
  }
}

然后在当前项目目录添加一个 .babelrc 的文件.

创建.babelrc文件

为什么要创建这个.babelrc文件?

在 webpack 有各种各样的loader。
有的loader配置比较复杂,一般就会提供一个指定名字的文件作为它的配置文件。
而不是全部都在 webpack.config.js 里去配置。
对应的loader在工作的时候,会根据实现预定好的文件名字去读取相关配置。
这里的 babal-loader 如果发现 webpack.config.js 的 moudle.rules对应的节点没有这些具体的配置。
就会在同级目录下找一个叫 .babelrc 的文件,读取里面的配置。

此文件内部就是一个JSON数据.在里面键入

{
  "presets": ["env"]
}

然后运行 npm run build

如果不出意外,打包将会成功.

babel配置并打包成功

然后打开打包成功的 bundle.js 文件.

image.png

箭头函数被 babel 编译成了 function.

未使用 babel打包的文件

对比一下.


很多博客讲到这里就结束了.

但是上述加载的那些包,'.babelrc' 文件里的配置是什么意思,基本都没有人说明.

我就简单说一下我自己的理解.可能错误,但是至少能够帮我们理解,这些配置每一步大概做了什么.

  • 首先我们安装了3个babel相关的包 npm i --save-dev babel-core babel-loader babel-preset-env
  • 其次,我们在 webpack.config.js 里配置了
    • module.rules[0].test=/\.js$/
    • module[0].use='babelloader'
    • module[0].exclude=/node_moudle/
  • 最后,我们新建了一个 .babelrc 的文件,在内部写入的一串字符串 {"presets": ["env"]}

第一个配置项:test:/.js$/

test:/.js$/

匹配后缀名是 .js 的文件.......说了等于没有,这么简单正则表达式谁都会....

那到底是什么时候匹配呢?

webpack 从入口的 index.js 一直到所有有依赖关系的 js 文件中,遇到了 import xxx from xxx 或者 require(xxxxxx) .
发现,后缀名是 .js 的时候,这个时候就是匹配的时候.

第二个配置:use:'babel-loader'

  • 当匹配到.js文件后,webpack就会加载babel-loader模块(其内部肯定依赖的babel-core模块)
  • 然后匹配到模块数据递交给 babel-loader.

交给 babel-loader 什么呢?做代码降级.
怎么降级babel-loader 已经知道了.肯定是降级到 ES5 .
但是目标代码是用啥写的呢?
ES3 ES7 SE8 ES100000(只是为了说明问题) ????

第三个配置:.babelrc presets:['env']

presets:['env']
  • 通过 .babelrc.presets[0]===env ,babel-loader 就知道我们写的是ES6代码.
  • 这也是众多文章和博客里写的所谓的"预设"

所以,最终我们配置 babel 的大体流程是.

  • npm i --save-dev babel-core babel-loader babel-preset-env
  • 在 import/require xxx.js 的时候,babel-loader 就根据 .babelrc 里配置的 env(babel-preset-env),知道它现在接受到的模块内容是用ES6写的.
  • 最终,babel-loader 借助 babel-core 也好 ,babel-preset-env 也罢,将ES6 -> ES5 的代码.

babel-配置-打包流程

相关文章

网友评论

      本文标题:webpack学习笔记二,关于babel

      本文链接:https://www.haomeiwen.com/subject/lhzjyqtx.html