Vue+webpack+Element 兼容问题总结(小结)


Posted in Javascript onAugust 16, 2018

项目中用到了Vue.js和Elenment-UI

Vue官方文档中给出明确范围:Vue 不支持 IE8 及以下版本,因为 Vue 使用了 IE8 无法模拟的 ECMAScript 5 特性。但它支持所有兼容 ECMAScript 5 的浏览器。

而且Element-UI支持IE10+及大多数浏览器。由此要用到Babel,主要用于将ECMAScript 2015+代码转换为旧浏览器或环境中向后兼容的JavaScript版本。在此之前,需要先搞清楚IE6~11是否支持es5:

  • IE6~IE8:不支持es5的所有语法;
  • IE9:支持除ECMAScript 5 Strict Mode外的es5语法;
  • IE10:支持es5的所有语法;
  • IEÏ11:支持es5所有语法及es6中const和Typed Arrays新语法

babel可以把同种语言的高版本规则翻译成低版本规则,其转译过程也分为三个阶段:parsing、transforming、generating。(1)解析步骤接收代码并输出 AST(抽象语法树),这其中又包含两个阶段词法分析和语法分析。词法分析阶段把字符串形式的代码转换为令牌(tokens)流。语法分析阶段会把一个令牌流转换成 AST 的形式,方便后续操作。(2) 利用我们配置好的plugins/presets把Parser生成的AST转变为新的AST。(3)代码生成步骤过程是深度优先遍历整个 AST,然后构建可以表示转换后代码的字符串。

下面总结Babel的使用:

1、由于项目使用了webpack打包工具,安装

npm install --save-dev babel-loader babel-core

2、在webpack.config.js中设置

module: {
  rules: [
   {
    test: /\.js$/,
    loader: "babel-loader",
    include: [
     resolve("src"),
     resolve("test"),
    ],
   },Ï
  ]
}

可以根据webpack中Module的选项来配置相应内容

3、在根目录下创建.babelrc文件来添加插件,文件添加成功后,可以开始配置内容

首先,可以使用evn预设置,它支持ES2015+的转换

npm install babel-preset-env --save-dev

在.babelrc文件中

{
"presets":["evn"]

}

如果没有任何配置选项,babel-preset-env的行为与babel-preset-latest(或babel-preset-es2015、babel-preset-es2016和babel-preset-es2017一起)完全相同。

当然,还有可选的选项可以配置,例如:

[
   "env",
   {
    "modules": false,
    "targets": {
     "browsers": ["> 1%", "last 2 versions"]
    }
   }
   "stage-2"
  ],

evn中设置项所代表的意思:

  • targets.node 支持到哪个版本的
  • node targets.browsers 支持到哪个版本的浏览器
  • loose 启动宽松模式,配合 webpack 的 loader 使用
  • modules 使用何种模块加载机制
  • debug 开启调试模式
  • include 包含哪些文件
  • exclude 排除哪些文件
  • useBuiltIns 是否对 babel-polyfill 进行分解,只引入所需的部分

targets.browsers是参考browserslist https://github.com/browserslist/browserslist设置浏览器条件。

设置了完成后,还需要用babel-polyfill来实现浏览器不能支持的原生代码,在浏览器引入了相应的polyfill后,可以用新的内置对象比如 Promise 或者 WeakMap, 静态方法比如 Array.from 或者 Object.assign, 实例方法比如 Array.prototype.includes。但是因为babel-polyfill是在原型链上直接添加方法,会污染全局变量,项目打包以后体积增大。

npm install --save babel-polyfill

若在应用程序的入口顶点引入,则

require("babel-polyfill");

如果在应用程序的入口点使用ES6的导入语法,则应该在入口点的顶部导入polyfill,以确保首先加载polyfills

import("babel-polyfill");

如果通过webpack.config.js,在入口处添加:

module.exports = { entry: ["babel-polyfill", "./app/js"] };

为了不污染全局对象和内置的对象原型,可以用babel-plugin-transform-runtime,在.babelrc文件中

"plugins": [
  [
   "transform-runtime",
   {
    "helpers": false,
    "polyfill": true,
    "moduleName": "babel-runtime"
   }
  ],
 ]

插件应用于babel的转译过程,尤其是第二个阶段transforming,如果这个阶段不使用任何插件,那么babel会原样输出代码。
如果同时添加了plugins和presets,注意:插件会在预设项之前运行;插件按第一个到最后一个正序执行;预设中设置从最后一个到第一个逆序执行,设置时注意执行顺序。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JsEasy简介 JsEasy是什么?与下载
Mar 07 Javascript
JQuery扩展插件Validate 5添加自定义验证方法
Sep 05 Javascript
JQuery筛选器全系列介绍
Aug 27 Javascript
浅析jquery的js图表组件highcharts
Mar 06 Javascript
bootstrap布局中input输入框右侧图标点击功能
May 16 Javascript
对javascript继承的理解
Oct 11 Javascript
JavaScript实现自定义媒体播放器方法介绍
Jan 03 Javascript
Angular2开发——组件规划篇
Mar 28 Javascript
解决微信小程序防止无法回到主页的问题
Sep 28 Javascript
node.js 微信开发之定时获取access_token
Feb 07 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
Aug 18 Javascript
JavaScript代码实现简单计算器
Dec 27 Javascript
Vue 与 Vuex 的第一次接触遇到的坑
Aug 16 #Javascript
深入理解Vue 组件之间传值
Aug 16 #Javascript
JS加密插件CryptoJS实现的Base64加密示例
Aug 16 #Javascript
vue中引用swiper轮播插件的教程详解
Aug 16 #Javascript
JS加密插件CryptoJS实现的DES加密示例
Aug 16 #Javascript
JS加密插件CryptoJS实现AES加密操作示例
Aug 16 #Javascript
实例详解vue.js浅度监听和深度监听及watch用法
Aug 16 #Javascript
You might like
索尼SONY ICF-7600A(W)电路分析
2021/03/01 无线电
PHP:风雨欲来 路在何方?
2006/10/09 PHP
php 删除目录下N分钟前创建的所有文件的实现代码
2013/08/10 PHP
php开启openssl的方法
2014/05/15 PHP
PHP随机生成信用卡卡号的方法
2015/03/23 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
xml 与javascript结合的问题解决方法
2007/03/24 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
jquery显示隐藏元素的实现代码
2016/05/19 Javascript
jQuery文字横向滚动效果的实现代码
2016/05/31 Javascript
jQuery解决$符号命名冲突
2016/06/18 Javascript
checkbox批量选中,获取选中项的值的简单实例
2016/06/28 Javascript
jQuery选择器中的特殊符号处理方法
2017/09/08 jQuery
详解node nvm进行node多版本管理
2017/10/21 Javascript
vue-cli3.X快速创建项目的方法步骤
2019/11/14 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
[00:26]TI7不朽珍藏III——冥界亚龙不朽展示
2017/07/15 DOTA
从零学Python之入门(三)序列
2014/05/25 Python
举例区分Python中的浅复制与深复制
2015/07/02 Python
python出现"IndentationError: unexpected indent"错误解决办法
2017/10/15 Python
python 创建一个空dataframe 然后添加行数据的实例
2018/06/07 Python
python实现微信打飞机游戏
2020/03/24 Python
使用pycharm和pylint检查python代码规范操作
2020/06/09 Python
CSS3按钮鼠标悬浮实现光圈效果源码
2016/09/11 HTML / CSS
台湾三立电视电商平台:电电购
2019/09/09 全球购物
贝佳斯官方网站:Borghese
2020/05/08 全球购物
新锐科技Java程序员面试题
2016/07/25 面试题
出口公司经理求职简历中的自我评价
2013/10/13 职场文书
领导证婚人证婚词
2014/01/13 职场文书
2014年爱国卫生工作总结
2014/11/22 职场文书
解除处分决定书
2015/06/25 职场文书
教导处教学工作总结
2015/08/12 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python
python必学知识之文件操作(建议收藏)
2021/05/30 Python
Mysql实现简易版搜索引擎的示例代码
2021/08/30 MySQL