博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iview-admin(cli3 + webpack4 )解决兼容ie9+ 法案
阅读量:5357 次
发布时间:2019-06-15

本文共 7564 字,大约阅读时间需要 25 分钟。

前言:经过多次试验终于可以让iview-admin兼容ie9+了,直接往下看↓↓↓

 

一、准备工作

  (建议node版本安装到8.2以上)

  1.从github上下载或Clone vivew-admin 项目

    github地址:  

    Clone地址:https://github.com/iview/iview-admin.git

  2.初始化项目

    npm install     或     npm install --registry=https://registry.npm.taobao.org

  3.启动项目

    npm run dev

二、处理兼容

  (项目起来后我们会发现在 Chrome、Firefox 的高级浏览器上是正常的,但在ie9~ie11  上面显示是一片空白,打开控制台,发现报错如下图:)

    

    问题原因:ie11-  不兼容 es6 语法 

    解决法案:

      方案一:安装"@babel/polyfill" 

          然后发现依然不起作用,折腾了好久出来是出来了,但舍去和调改了好多东西,所以最终放弃这种方法

      方案二:安装 "babel-loader"  

         1.安装依赖

             (webpack官方安装地址:  )  

                              npm install -D babel-loader @babel/core @babel/preset-env webpack 

        安装成功之后package.json 配置文件如下:     

"devDependencies": {              "@babel/core": "^7.4.5",              "@babel/preset-env": "^7.4.5",              "@vue/cli-plugin-babel": "^3.0.1",              "@vue/cli-plugin-eslint": "^3.0.1",              "@vue/cli-plugin-unit-mocha": "^3.0.1",              "@vue/cli-service": "^3.0.1",              "@vue/eslint-config-standard": "^3.0.0-beta.10",              "@vue/test-utils": "^1.0.0-beta.10",              "babel-loader": "^8.0.6",              "chai": "^4.1.2",              "eslint-plugin-cypress": "^2.0.1",              "less": "^2.7.3",              "less-loader": "^4.0.5",              "lint-staged": "^6.0.0",              "mockjs": "^1.0.1-beta3",              "vue-template-compiler": "^2.5.13",              "webpack": "^4.34.0"            },

        2.在vue.config.js 配置weibpack

        (Cli 官方webpack配置地址:  )

 

 
module.exports = {
          //...
          configureWebpack:{                                module:{                    rules: [                      // 'transform-runtime' 插件告诉 Babel                      // 要引用 runtime 来代替注入。                      {                        test: /\.m?js$/,                        //exclude用上面配置的话,默认是过滤不编译node_modules 路径下的文件                        //exclude: /(node_modules|bower_components)/,                        //include 指定需要编译的文件路径                        include: [                          resolve('src'),                          resolve('node_modules/tree-table-vue/lib'),                          resolve('node_modules/v-org-tree/dist'),                          resolve('node_modules/iview/src/locale')                        ],                        use: {                          loader: 'babel-loader',                          options: {                            presets: ['@babel/preset-env']                          }                        }                      }                    ]                  }                },                chainWebpack: config => {                  config.resolve.alias                    .set('@', resolve('src')) // key,value自行定义,比如.set('@@', resolve('src/components'))                    .set('_c', resolve('src/components'))                }         //...

         }

 

 

 

        按上面的配置,然后重启项目,你会发现在ie9+ 都可以正常预览了,看下图↓↓↓

                            

 

        补充说明下,为什么我们使用@babel/polyfill 是ie下然后会报错的原因,是因为iview date 组件i18n 及 v-org-tree 和tree-table-vue组件里面有es6的语法,而他们都在"node_modules"路径下,而编译工具默认是不编译这个文件下文件的

        所以所以使用 include 指定 node_modules 路径需要编译文件路径

 三、Bug 处理

  1.ie11 下 点击右上角全屏 图标后,再次点击不退出全屏bug

    将src/components/main/components/fullscreen/fullscreen.vue  里的全屏事件监听事件名纠正为MSFullscreenChange即可正常监听事件变化,功能恢复正常。   具体代码如下:

document.addEventListener('msfullscreenchange', () => {                    this.$emit('input', !this.value)                    this.$emit('on-change', !this.value)                  })                //更改为                  document.addEventListener('MSFullscreenChange', () => {                    this.$emit('input', !this.value)                    this.$emit('on-change', !this.value)                  })

  2.ie9下右侧内容下坠问题

    在src/components/main/main.vue   添加 float:left  样式

//修改后

  修改后效果 如下,剩下还需要修改一下css样式

 

   3.ie下其他报错处理代码,在src/view/main.js   new Vue({})下方添加以下代码

/* eslint-disable no-new */new Vue({  el: '#app',  router,  i18n,  store,  render: h => h(App)})////下面是需要添加内容////***作用:兼容dataset*问题:[Vue warn]: Error in directive transfer-dom inserted hook: "TypeError: 无法获取未定义或 null 引用的属性“transfer”"*说明:ie10及以下不支持dataset,以下代码处理兼容* */if (window.HTMLElement) {  if (Object.getOwnPropertyNames(HTMLElement.prototype).indexOf('dataset') === -1) {    Object.defineProperty(HTMLElement.prototype, 'dataset', {      get: function () {        var attributes = this.attributes; // 获取节点的所有属性        var name = [];        var value = []; // 定义两个数组保存属性名和属性值        var obj = {}; // 定义一个空对象        for (var i = 0; i < attributes.length; i++) { // 遍历节点的所有属性          if (attributes[i].nodeName.slice(0, 5) === 'data-') { // 如果属性名的前面5个字符符合"data-"            // 取出属性名的"data-"的后面的字符串放入name数组中            name.push(attributes[i].nodeName.slice(5));            // 取出对应的属性值放入value数组中            value.push(attributes[i].nodeValue);          }        }        for (var j = 0; j < name.length; j++) { // 遍历name和value数组          obj[name[j]] = value[j]; // 将属性名和属性值保存到obj中        }        return obj; // 返回对象      },    });  }}/** *作用:兼容requestAnimationFrame(ie9) *问题: *说明:ie9是不支持requestAnimationFrame的,以下代码处理兼容 * */(function () {  var lastTime = 0;  var vendors = ['ms', 'moz', 'webkit', 'o'];  for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {    window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];    window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] ||      window[vendors[x] + 'CancelRequestAnimationFrame'];  }  if (!window.requestAnimationFrame) {    window.requestAnimationFrame = function (callback, element) {      var currTime = new Date().getTime();      var timeToCall = Math.max(0, 16 - (currTime - lastTime));      var id = window.setTimeout(function () { callback(currTime + timeToCall); },        timeToCall);      lastTime = currTime + timeToCall;      return id;    };  }  if (!window.cancelAnimationFrame) {    window.cancelAnimationFrame = function (id) {      clearTimeout(id);    };  }}());/** *作用:兼容classList(ie9) *错误信息: 无法获取未定义或 null 引用的属性“add”/  无法获取未定义或 null 引用的属性“remove” *说明:ie9以下代码处理兼容 * */if (!('classList' in document.documentElement)) {  Object.defineProperty(HTMLElement.prototype, 'classList', {    get: function () {      var self = this;      function update(fn) {        return function (value) {          var classes = self.className.split(/s+/g);          var index = classes.indexOf(value);          fn(classes, index, value);          self.className = classes.join(' ');        };      }      return {        add: update(function (classes, index, value) {          if (!~index) classes.push(value);        }),        remove: update(function (classes, index) {          if (~index) classes.splice(index, 1);        }),        toggle: update(function (classes, index, value) {          if (~index) { classes.splice(index, 1); } else { classes.push(value); }        }),        contains: function (value) {          return !!~self.className.split(/s+/g).indexOf(value);        },        item: function (i) {          return self.className.split(/s+/g)[i] || null;        },      };    },  });}

  4.ie下报vue  {description: "无法获取未定义或 nu...", message: "无法获取未定义或 nu...", name: "TypeError", number: -21468232

    清除浏览器缓存即可,快捷键  Ctrl + Shift +Delete

        

好了,暂时就这样,后面有新解决方法再更新,大家如果有其他简单好用的方法也可以留言给我❤

转载于:https://www.cnblogs.com/ysxq/p/11052207.html

你可能感兴趣的文章
Vue css过渡 和 js 钩子过渡
查看>>
【AMAD】Stream-Framework -- 让你可以使用Cassandra和Redis构建新闻feed,活动流(activity stream)以及通知系统。...
查看>>
msvcr100.dll问题描述及修复方式
查看>>
JVM字节码执行引擎和动态绑定原理
查看>>
注册苹果开发者账号的详细步骤
查看>>
武汉Uber优步司机奖励政策
查看>>
青岛Uber优步司机奖励政策(8/10-8/16)
查看>>
window下安装Memcache
查看>>
遍历子窗口
查看>>
MySQL查询语法
查看>>
第三方苹果开发库之ASIHTTPRequest(翻译版)
查看>>
Delphi XE6记录类型赋值
查看>>
状态模式
查看>>
石子归并
查看>>
connect socket的超时设置
查看>>
汪曾祺《受戒》
查看>>
Thread Based Parallelism - Thread in a Subclass
查看>>
Delphi TCOM控件串口通信调试寻找文件传输速度慢的原因
查看>>
Objective-C MRC多个对象相互引用的内存管理
查看>>
ServerSocketChannel和SocketChannel
查看>>