Babel 7的使用和说明

3 篇文章 0 订阅
1 篇文章 0 订阅

前端代码兼容Chrome 44,Babel 7的使用和说明

问题

目前公司多数测试同感云平台的浏览器一般是Chorme 77,现遇到特殊情况,必须要在Chorme 44上运行平台,因为浏览器版本低,会报错:

网上大致查看了一下错误原因,是es6语法出错,可能因为Chorme 44版本太低,不支持es6的语法。奇怪的一点,之前已经用过babel-loader模块转换过代码,但还存在一兼容问题,会不会是有些语法需要单独的插件转换。还是说babel-loader的版本过低,有些功能不支持了。

既然这样那就先试试,如何用webpack 4.x实现es6的转换,当然网上也找到了类似的Chorme 44不兼容问题,也可以按步骤操作看看效果,在操作之前写单独对babel-loader知识认识一下。

轻松搞定webpack4的babel6

babel-loader

babel-loader用来处理ES6+并将其编译为ES5,也同时与Webpack同工作的模块它使我们能够在工程中使用最新的语言特性(甚至提案中),同时不必特别关注这些特性在不同平台的兼容问题。

babel-core

Babel编译器的核心模块。

babel-preset-env

它是Babel官方推荐的预置器,可根据用户设置的目标环境自动添加所需要的插件和补丁来编译ES6+代码。

新建文件夹es6-babel,npm init 初始化得到package.json文件。

npm init
安装babel-loader babel-core babel-preset-env ,当然后续要用到webpack , 也要安装webpack,webpack-cli(需要升级)
npm install babel-loader babel-core babe-preset-env
npm install webpack webpack/cli
npm i wepback-cli@3.1.1 -D

安装以上三个所需要的包,默认情况下是最新的版本,这里在最后转换时会有问题,版本会不匹配。建议:

babel-loader和babel-core版本不对应所产生的,

  • babel-loader 8.x对应babel-core 7.x

  • babel-loader 7.x对应babel-core 6.x

文件目录

实例代码

新建src/index.html

<!DOCTYPE html>
<html lang="zh-CN">
    <head>
        <meta charset="utf-8">
        <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport">
        <title>同感云平台</title>
    </head>
    <body></body>
    <script src="../dist/bundle.js"></script>
</html>


新建src/index.js

let div = require('./helloworld');
document.body.appendChild(div());

JavaScript

新建src/helloworld.js ,该文件使用了es6的let ,const,箭头函数。

// 输出模块
let add = () => {
    // 这里使用了箭头函数,还有let和const关键字哦~~
    let content = "Hello ";
    const NAME = "ES6";
    var div = document.createElement('div');
    div.innerHTML = content + NAME;
    return div;
};
module.exports = add;

查看package.json 文件

{
  "name": "es6-babel",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "dependencies": {
    "babel-core": "^6.26.3",
    "babel-loader": "^7.1.4",
    "babel-preset-env": "^1.7.0",
    "webpack": "^4.5.0"
  },
  "devDependencies": {
    "webpack-cli": "^3.1.1"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "webpack ./src/index.js --mode-development"
  },
  "author": "",
  "license": "ISC"
}

配置webpack.config.js的内容

// Node.js的一个路径模块,用于操作文件路径
const path = require('path');

module.exports = {
    entry: './src/index.js',
    output: {
        path: path.resolve(__dirname, 'dist'), // 注意这里是'dist'而不是'/dist',不然会报错,Error: EACCES: permission denied, mkdir '/dist'
        filename: "bundle.js"
    },
    module: {
        rules: [{ // 这里用rules而不是loaders
            test: /\.js$/, // 匹配所有js文件
            exclude: /node_modules/, // 排除掉node_modules这个文件夹的js文件
            loader: 'babel-loader', // 加载babel工具包
            options: { // 这里用options而不是query,虽然可以兼容,但是还是按照规则来吧
                presets: ['env'] // 使用es6工具包
            }
        }]
    }
};

最后我们来运行一下代码

查看打包后的代码dist/bundle.js,已经将ES6语法转为ES5语法了。

同时界面上也达到了输出效果

babel 7的具体使用

@babel/cli

@babel/cli是babel提供的内建的命令行工具,主要是提供babel这个命令来对js文件进行编译

我们在安装了@babel/cli之后,使用@babel/cli编译

新建项目es6-babel7

npm init
npm install --save-dev @babel/cli

@babel/core

@babel/cli是依赖一个叫@babel/core的包文件的,没有这个包文件是绝对不能执行任何编译操作的(因为执行编译的transform方法在这个包里)

npm install --save-dev @babel/core

安装到这里,如果你用过 babel 6,可能要问,怎么不是 npm install --save-dev babel-cli@ 符号又是什么?这是 babel 7 的一大调整,原来的 babel-xx 包统一迁移到babel 域下 - 域由 @ 符号来标识,一来便于区别官方与非官方的包,二来避免可能的包命名冲突。

文件目录

此时在文件index.js文件中写入如下代码

let a = 1;
const pi = 3.14;
let fun = () => console.log('hello babel');
class Robot {
    constructor(msg) {
        this.message = msg
    }
    say() {
        alertMe(this.message)
    }
}
const marvin = new Robot('hello babel')
marvin.say();

.babelrc文件中不写入任何配置和插件

{
    "presets":[],
    "plugins": []

}

执行npx babel index.js编译结果都是该文件无任何变化,这个问题的发生来自 babel 6 。Babel 6 做了大量模块化的工作,将原来集成一体的各种编译功能分离出去,独立成插件。这意味着,默认情况下,当下版本的 babel 不会编译代码。

 

@babel/plugin-transform-block-scoping

@babel/plugin-transform-arrow-functions

@babel/plugin-transform-classes

这说明要使用各种真正的编译功能是需要配合各种插件的,这里简单使用三种:

要将箭头函数编译成普通函数需要使用@babel/plugin-transform-arrow-functions,

要将const或者let变量编译成var变量需要@babel/plugin-transform-block-scoping,

要将class关键字转化成传统基于原型的类需要@babel/plugin-transform-classes,

所以为了真正的编译我们是可能需要大量各种的插件的,具体插件有哪些请点这里

npm install --save-dev @babel/plugin-transform-block-scoping
npm install --save-dev @babel/plugin-transform-arrow-functions
npm install --save-dev @babel/plugin-transform-classes

先单独看一下每个插件的效果:

如果我的代码中大量使用插件,那我依然避免不了在配置文件中大量填写插件信息的工作,但是伟大的babel为了让程序员们有更多的时间放在编写上,它提供了一个叫做preset的概念,说好听点叫预设,直白点就是插件包的意思,意味着babel会预先替我们做好了一系列的插件包,如下4个常用的插件包

这里主要使用了一下@babel/preset-env,官网上推荐使用这个包,那我们先安装一下 npm install --save-dev @babel/preset-env

Chrome 44解决兼容问题

本次问题主要还是因为,babel 6到babel 7的一次升级,要想使用bable 6 ,就必须配置一些额外的插件库,所以在项目中更新的babel的版本。 在webpack.config.js中配置如下:

参考学习地址:

1.babel 7 的使用的个人理解:https://www.jianshu.com/p/cbd48919a0cc

2.前端代码兼容 Chrome 44 的部分操作记录:

https://segmentfault.com/a/1190000019477441?utm_source=tag-newest

3.简单粗暴搞定webpack4的babel-loader:

https://blog.csdn.net/DreamFJ/article/details/81671973

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值