本文将要介绍 webpack,Babel,babel-loader 的关系。理清楚他们各自做了什么事情。

通常我们新建一个项目,会先配置webpack,然后配置babel;babel是一个编译工具,实际上,babel也是可以单独使用的。

下面我们从Babel出发,简单配置一个react项目,来清晰认识一下webpack和babel的关系。

Babel 和 Webpack 简介

Babel 是一个 JavaScript 编译器。(把浏览器不认识的语法,编译成浏览器认识的语法。)

webpack 是一个现代 JavaScript 应用程序的静态模块打包器。(项目打包)

下面会用到的:

名称 描述
@babel/cli Babel附带了一个内置的CLI,可用于从命令行编译文件。
@babel/core 使用本地配置文件
@babel/preset-env 编译最新版本JavaScript
@babel/preset-react 编译react
@babel/polyfill 通过 Polyfill 方式在目标环境中添加缺失的特性
@babel/plugin-proposal-class-properties 编译 class

开始配置

新建项目

mkdir babel-in-webpack

进入项目

cd babel-in-webpack/

初始化 npm

npm init

不用管提示,一顿回车键。然后会生成一个文件 package.json

配置 Babel

安装 Babel 相关依赖。Babel7将所有包放在了@babel/ 下。

npm install --save-dev @babel/cli @babel/core @babel/preset-env @babel/polyfill

新建文件 babel.config.json

{
"presets": [
"@babel/preset-env"
],
"plugins": []
}

新建文件夹 srcsrc 内新建文件 test.js,随便写点啥es6语法。

使用下面命令编译

./node_modules/.bin/babel src --out-dir lib

编译完会新增目录lib, 里面放着编译好的文件

配置 React

安装 Babel 编译 React 的依赖

npm install --save-dev @babel/preset-react @babel/plugin-proposal-class-properties

babel.config.json 添加 React 相关配置

{
"presets": [
"@babel/preset-env",
"@babel/preset-react"
],
"plugins": [
"@babel/plugin-proposal-class-properties"
]
}

安装 React 相关依赖

npm install --save react react-dom

src 下新增 react 文件 main.js

import React from 'react';
import ReactDOM from 'react-dom'; class App extends React.Component {
render() {
return (
<div>Hello World!</div>
)
}
} ReactDOM.render(<App />, document.getElementById('root'));

运行命令编译

./node_modules/.bin/babel src --out-dir lib

编译完成后 lib 下多了一个 main.js

看起来编译很成功, 我们在 lib 下面新建一个 html 引入 main.js 看看效果

报错,浏览器不认识require,继续往下看。

配置 webpack

安装 webpack 依赖

npm install --save-dev webpack webpack-cli

根目录新建文件 webpack.config.js

const path = require('path');

module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].js'
}
};

package.jsonscripts 中加入命令

"build": "webpack --mode development",

运行命令

npm run build

webpack 不认识 react 语法,在 webpack.config.js 中加入 babel-loader

const path = require('path');

module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].js'
},
module: {
rules: [
{ test: /\.js$/, use: 'babel-loader' }
]
},
plugins: []
};

安装依赖 babel-loader

npm install --save-dev babel-loader

运行命令

npm run build

会看到 dist/main.js, 写个html引入试试

两种编译结果对比

我们来看 Babel 编译结果 lib/main.jswebpack 编译结果 dist/main.js,发现 Babel 仅仅是将 src/main.js 的react语法编译成了js语法,而 webpacksrc/main.js 和引入的 node_modules 融合后用 Babel 编译。

浏览器不认识 requirewebpack 实现了一套浏览器认识的 require

总结

Babel 是编译工具,把高版本语法编译成低版本语法,或者将文件按照自定义规则转换成js语法。

webpack 是打包工具,定义入口文件,将所有模块引入整理后,通过loader和plugin处理后,打包输出。

webpack 通过 babel-loader 使用 Babel

代码地址:GitHub

webpack,Babel,babel-loader的关系的更多相关文章

  1. 使用webpack、babel、react、antdesign配置单页面应用开发环境

    这是Webpack+React系列配置过程记录的第一篇.其他内容请参考: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-rout ...

  2. webpack中babel配置 --- runtime-transform和babel-pollfill

    webpack - babel配置 babel是一个javascript编译器,是前端开发中的一个利器.它突破了浏览器实现es标准的限制,使我们在开发中可以使用最新的javascript语法. 通过构 ...

  3. (15/24) 为webpack增加babel支持

    Babel是什么? Babel是一个编译JavaScript的平台,它的强大之处表现在可以通过编译达到以下目的: 使用下一代的javaScript代码(ES6,ES7-.),即使这些标准目前并未被当前 ...

  4. webpack快速入门——给webpack增加babel支持

    1.Babel的安装与配置 Babel其实是几个模块化的包,其核心功能位于称为babel-core的npm包中,webpack可以把其不同的包整合在一起使用,对于每一个 你需要的功能或拓展,你都需要安 ...

  5. vue 项目中 自定义 webpack 的 配置文件(webpack.config.babel.js)

    webpack.config.babel.js,这样命名是想让webpack在编译的时候自动识别es6的语法,现在貌似不需要这样命名了,之前用webpack1.x的时候貌似是需要的 let path ...

  6. Babel与Polyfill的关系和区别

    很多同学搞不清楚babel与polyfill的关系以及区别,这儿给大家细致解惑. Babel:Babel 是一个广泛使用的 ES6 转码器,可以将 ES6 代码转为 ES5 代码.注意:Babel 默 ...

  7. 17 webpack中babel的配置

    在webpack中,默认只能处理一部分ES6的新语法,一些更高级的ES6语法或者ES7语法, webpack是处理不了的:这时候,就需要借助于第三方的loader,来帮助webpack处理这些高级的语 ...

  8. webpack使用babel

    几个月没用webpack都忘了好多了. webpack构建前端,使用时除了entry/output,就是plugins和module.loaders,还有本地测试的devServer. npm ins ...

  9. (6)webpack使用babel插件的使用

    为什么要使用babel插件? 首先要了解babel插件是干嘛的,随着js的语法规范发展,出现了越来越多的高级语法,但是使用webpack打包的时候,webpack并不能全部理解这些高级语法,需要我们使 ...

随机推荐

  1. MongoDB的初级安装和使用

    对于非关系型数据库,很多人不是很清楚,我也是作为新手慢慢摸索, 外网地址下载贼慢:我烦放在自己的百度网盘里 软件链接:https://pan.baidu.com/s/1A7h4VOfvm8N2gnlJ ...

  2. hql错误:No data type for node: org.hibernate.hql.ast.tree.IdentNode

    今天写了一个查询,用的是hql,数据库是mysql.多表联查,结果报错了报: \-[IDENT] IdentNode: 'routerNumber' {originalText=routerNumbe ...

  3. 概念--Maven仓库

    转:Maven:mirror和repository 区别 Tip: 默认中央仓库的地址:https://repo.maven.apache.org/maven2 1.Maven仓库主要有2种 remo ...

  4. documentFragment深入理解

    documentFragment是一个保存多个element的容器对象(保存在内存)当更新其中的一个或者多个element时,页面不会更新.只有当documentFragment容器中保存的所有ele ...

  5. POJ 2112 Optimal Milking 最短路 二分构图 网络流

    题意:有C头奶牛,K个挤奶站,每个挤奶器最多服务M头奶牛,奶牛和奶牛.奶牛和挤奶站.挤奶站和挤奶站之间都存在一定的距离.现在问满足所有的奶牛都能够被挤奶器服务到的情况下,行走距离的最远的奶牛的至少要走 ...

  6. 刷金币全自动脚本 | 让Python每天帮你薅一个早餐钱(送源码)

    刷金币全自动脚本 | 让Python每天帮你薅一个早餐钱(送源码) 测试开发社区  6天前 文章转载自公众号  AirPython , 作者 星安果 阅读文本大概需要 12 分钟. 1 目 标 场 景 ...

  7. Book. Effective C++ item2-尽量使用const, enum, inline替换#define

    ##常规变量 c++里面的#define后面的定义部分,是不算代码的一部分的.所以如果你使用#define: #define ASPECT_RATIO 1.653 你希望这个代号ASPECT RATI ...

  8. Android长按及拖动事件探究

    Android中长按拖动还是比较常见的.比如Launcher中的图标拖动及屏幕切换,ListView中item顺序的改变,新闻类App中新闻类别的顺序改变等.下面就这个事件做一下分析. 就目前而言,A ...

  9. ElasticSearch实战系列五: ElasticSearch的聚合查询基础使用教程之度量(Metric)聚合

    Title:ElasticSearch实战系列四: ElasticSearch的聚合查询基础使用教程之度量(Metric)聚合 前言 在上上一篇中介绍了ElasticSearch实战系列三: Elas ...

  10. openpyxl(python操作Excel)

    一.安装 >>> pip install openpyxl import openpyxl 二.常用操作 1.创建与保存一个工作簿 wb = openpyxl.Workbook() ...