从零开始搭建一个前端框架(六)通过babel实现浏览器兼容支持

说在前面

某些时候,我们不得不考虑浏览器的兼容性,如今主流的浏览器,包括ChromeEdgeFirefoxOperaSafari都对ES6有了不同程度的支持,但是前端永远绕不过IE的坎,本节我们就针对IE的兼容性做功课。

很遗憾的告诉大家,从Vue3开始,已经放弃了对IE11的支持,如果仍然需要支持IE11或者更低的版本,仍然需要使用Vue2,这里为了说明下通过代码转码实现浏览器的兼容,准备了一个基于webpack 5.x的最小化demo。具体的搭建过程可以参考之前的文章

代码结构

- src
-- index.js
-- index.html
- package.json
- webpack.config.js
// index.html
<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <!-- <link rel="icon" href="<%= BASE_URL %>favicon.ico"> -->
  </head>
  <body>
    <div id="app"></div>
    <!-- built files will be auto injected -->
    <script src="bundle.js"></script>
  </body>
</html>

index.js中,我们引入了es6几个特性,模板字符串,Symbol以及箭头函数。

// index.js
console.log(`string text line 1
string text line 2`);
console.log(typeof Symbol.iterator)
const materials = [
  'Hydrogen',
  'Helium',
  'Lithium',
  'Beryllium'
];

console.log(materials.map(material => material.length));

// webpack.config.js
const path = require('path');
module.exports = {
	entry: {
        index: './src/index.js',
    },
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'bundle.js',
    },
}

效果对比

在这之前我试用的是Edge浏览器,信息可以正常打印,此时我们把代码复制到IE浏览器,却只能看到:

在这里插入图片描述

这是因为在转换后的代码中有大量的ES6代码,IE浏览器无法识别这些语法,上面的错误提示点击跳转,发现是箭头函数未能识别,此时我们为代码添加babel-loader进行转码。

安装

更多细节可以参考webpack官网,targetbabel-loader

npm install -D babel-loader @babel/core @babel/preset-env
npm install -D @babel/plugin-transform-runtime
// webpack.config.js
const path = require('path');
module.exports = {
	entry: {
        index: './src/index.js',
    },
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'bundle.js',
    },
    target: ['web', 'es5'],
    module: {
        rules: [
            {
                test: /\.m?jsx?$/,
                exclude: /(node_modules|bower_components)/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-env'],
                        plugins: ['@babel/plugin-transform-runtime']
                    }
                }
            }
        ]
    },
}

此时可以发现,编译后的代码中已经不存在箭头函数了。但是运行代码,还是会出现错误:

在这里插入图片描述

babel-polyfill收尾

babel-loader并不能完成所有es6的解码,此时报错信息提示Symbol未定义,详情可参考【解决】IE浏览器提示SCRIPT5009 “Symbol”未定义

npm install --save babel-polyfill

index.js首行添加 import 'babel-polyfill';然后执行打包命令。至此,IE浏览器已经不会提示任何错误了。

在这里插入图片描述

说到最后

其实不管是webpack4还是webpack5Vue2或者Vue3,对于解决的思路都是大同小异的,只是不同版本可能有不同的实现方案,建议参考官方的例子,选择相应的版本,更重要的是掌握解决问题的思路,多动手,多思考。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值