从零开始搭建一个前端框架(六)通过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
    评论
1. 创建项目文件夹,使用npm init初始化项目,生成package.json文件。 2. 安装Vue.js和Vue CLI(命令行界面)。 npm install vue npm install -g vue-cli 3. 使用Vue CLI创建项目。 vue init webpack my-project 4. 进入项目文件夹,安装依赖。 cd my-project npm install 5. 启动项目,查看是否成功。 npm run dev 6. 添加路由管理器vue-router。 npm install vue-router 7. 在src文件夹中创建views文件夹,存放所有页面组件。 8. 在src文件夹中创建components文件夹,存放所有公共组件。 9. 在src文件夹中创建assets文件夹,存放所有图片、样式和字体文件。 10. 在src文件夹中创建utils文件夹,存放所有工具函数。 11. 在src文件夹中创建config文件夹,存放所有配置文件。 12. 在src文件夹中创建store文件夹,存放所有状态管理文件。 13. 在src文件夹中创建App.vue文件,作为根组件,包含所有其他组件。 14. 在src文件夹中创建main.js文件,作为项目入口文件,配置路由、状态管理、插件等。 15. 在src文件夹中创建router文件夹,存放所有路由配置文件。 16. 在src文件夹中创建store文件夹,存放所有状态管理文件。 17. 在src文件夹中创建plugins文件夹,存放所有插件文件。 18. 在src文件夹中创建filters文件夹,存放所有过滤器文件。 19. 在src文件夹中创建mixins文件夹,存放所有混入文件。 20. 在src文件夹中创建directives文件夹,存放所有指令文件。 21. 在src文件夹中创建services文件夹,存放所有服务文件。 22. 在src文件夹中创建mock文件夹,存放所有mock数据文件。 23. 在根目录下创建vue.config.js文件,配置webpack,例如添加别名、打包选项等。 24. 在根目录下创建.babelrc文件,配置babel转码规则,例如添加ES6转ES5的插件。 25. 在根目录下创建.postcssrc.js文件,配置postcss转码规则,例如添加autoprefixer插件。 26. 在根目录下创建.editorconfig文件,配置编辑器格式化规则。 27. 在根目录下创建.eslint.js文件,配置eslint规则。 28. 在根目录下创建.prettierrc文件,配置prettier规则。 29. 在根目录下创建README.md文件,编写项目介绍、使用方法等文档。 30. 在根目录下创建LICENSE文件,添加开源协议。 这样,一个基于vue2.0的前端框架搭建好了。在实际开发过程中,可以根据项目需求进行修改和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值