Vue+webpack+Element 兼容问题总结

项目中用到了Vue.js和Elenment-UI
Vue官方文档中给出明确范围:Vue 不支持 IE8 及如下版本,由于 Vue 使用了 IE8 没法模拟的 ECMAScript 5 特性。但它支持全部兼容 ECMAScript 5 的浏览器。
并且Element-UI支持IE10+及大多数浏览器。由此要用到Babel,主要用于将ECMAScript 2015+代码转换为旧浏览器或环境中向后兼容的JavaScript版本。在此以前,须要先搞清楚IE6~11是否支持es5:javascript

  • 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,而后构建能够表示转换后代码的字符串。java

下面总结Babel的使用:
一、因为项目使用了webpack打包工具,安装node

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

二、在webpack.config.js中设置webpack

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

能够根据webpack中Module的选项来配置相应内容
三、在根目录下建立.babelrc文件来添加插件,文件添加成功后,能够开始配置内容
首先,可使用evn预设置,它支持ES2015+的转换git

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

.babelrc文件中es6

{
"presets":["evn"]

}

若是没有任何配置选项,babel-preset-env的行为与babel-preset-latest(或babel-preset-es201五、babel-preset-es2016和babel-preset-es2017一块儿)彻底相同。
固然,还有可选的选项能够配置,例如:github

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

evn中设置项所表明的意思:web

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

targets.browsers是参考browserslist https://github.com/browsersli... 设置浏览器条件。
设置了完成后,还须要用babel-polyfill来实现浏览器不能支持的原生代码,在浏览器引入了相应的polyfill后,能够用新的内置对象好比 Promise 或者 WeakMap, 静态方法好比 Array.from 或者 Object.assign, 实例方法好比 Array.prototype.includes。可是由于babel-polyfill是在原型链上直接添加方法,会污染全局变量,项目打包之后体积增大。npm

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,注意:插件会在预设项以前运行;插件按第一个到最后一个正序执行;预设中设置从最后一个到第一个逆序执行,设置时注意执行顺序。

相关文章
相关标签/搜索