国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

煦涵說Webpack-IE低版本兼容指南

tanglijun / 3310人閱讀

摘要:,是一個前端資源加載打包工具,現在版本已經到,今天的文章不支持介紹的及使用,而是對最近項目開發中使用打包時處理低版本及以下瀏覽器兼容問題做一次總結。

Webpack,Webpack 是一個前端資源加載/打包工具,現在版本已經 release 到 v2.6.1,今天的文章不支持介紹Webpack的API及使用,而是對最近項目開發中使用Webpack打包時處理IE低版本(IE8及以下)瀏覽器兼容問題做一次總結。issue直達,如果文章對您有幫助歡迎 star !!!

PC端項目前端基礎技術選型jQuery + ES6 + EJS + Babel + Webpack:

jQuery:提供選擇器和ajax接口兼容支持;

ES6:跟進前端趨勢,方便向后兼容;

EJS:提供前端模板引擎支持;

Babel:提供 ES6 轉碼支持;

Webpack: 提高前端資源加載/打包;

項目開發過程都在 Chrome 瀏覽器中,一切都OK,沒有任何問題,當在IE9以下瀏覽器中調試發現好多坑,現總結如下,以后新手參考。

Case One: defaultclasscatch ES3中保留字問題

報錯信息:

SCRIPT1048: 缺少標識符

對應代碼:

e.n = function (t) {
    var n = t && t.__esModule ? function () {
        return t.default
    } : function () {
        return t
    };
    return e.d(n, "a", n), n
}

網上查找資料,webpack有一款loader插件es3ify-loader來處理ES3的兼容問題,修改webpack配置,問題解決,添加規則如下:

module: {
    rules: [{
            test: /.js$/,
            enforce: "post", // post-loader處理
            loader: "es3ify-loader"
        }
    ]
}

這個loader是干啥用的捏,就是把這些保留字給你加上引號,使用字符串的形式引用,請看實例:

// 編譯前
function(t) { return t.default; }

// 編譯后
function(t) { return t["default"]; }
Case Two: uglify-js產生問題

重新構建,在IE低版本瀏覽器預覽,使用 webpack.optimize.UglifyJsPlugin 壓縮時,又報上面同樣的錯誤了,重新采用 beauty:true, build 發現引號被壓縮掉了,究其原因,研究了下uglify-js默認配置,發現了 compress.properties 屬性,增加build options如下,問題解決:

new webpack.optimize.UglifyJsPlugin({
    compress: {
        properties: false,
        warnings: false
    },
    output: {
        beautify: true
    },
    sourceMap: false
})
Case Three: uglify-js問題

重新構建,在IE低版本瀏覽器預覽,使用 webpack.optimize.UglifyJsPlugin 壓縮時,又報上面同樣的錯誤了,報錯代碼:

{
    catch: function (t) {
        return this.then(null, t)
    }
}

繼續查找uglify-js配置,發現 output.quote_keys,修改build options,問題解決:

new webpack.optimize.UglifyJsPlugin({
    compress: {
        properties: false,
        warnings: false
    },
    output: {
        beautify: true,
        quote_keys: true
    },
    sourceMap: false
}),

編譯后:

{
    "catch": function(t) {
        return this.then(null, t);
    }
}
Case Four: uglify-js問題

重新構建,在IE低版本瀏覽器預覽,報錯信息如下:

SCRIPT3126: 無法設置未定義或 null 引用的屬性

繼續分析壓縮后代碼,發現還是uglify-js問題,其mangle 配置屬性 mangle.screw_ie8 默認為 true, 什么意思捏,意思就是把支持IE8的代碼clear掉,screw you => 去你的,修改壓縮配置項,重新編譯,問題解決:

new webpack.optimize.UglifyJsPlugin({
    compress: {
        properties: false,
        warnings: false
    },
    output: {
        beautify: true,
        quote_keys: true
    },
    mangle: {
        screw_ie8: false
    },
    sourceMap: false
})
Case Five: ES5的API兼容報錯

在 webpack 的 entry 入口文件top引入 es5-shim 問題解決

require("es5-shim");
require("es5-shim/es5-sham");
Case Six: Console.log 問題

在 webpack 的 entry 入口文件top引入 console-polyfill 問題解決

require("console-polyfill");
Case Seven: Promise 兼容

在 webpack 的 entry 入口文件top引入 es6-promise 問題解決

require("es6-promise");
Case Eight: Object.defineProperty 問題

這個case 應該說是最難搞的一個case了,耗時也比較長,關鍵點在于使用 es5-shim/es5-sham也有問題,查看你官網發現在低版本瀏覽器也會有問題,官網描述如下:

?? Object.defineProperty
In the worst of circumstances, IE 8 provides a version of this method that only works on DOM objects. This sham will not be installed. The given version of defineProperty will throw an exception if used on non-DOM objects.
In slightly better circumstances, this method will silently fail to set "writable", "enumerable", and "configurable" properties.
Providing a getter or setter with "get" or "set" on a descriptor will silently fail on engines that lack "defineGetter" and "defineSetter", which include all versions of IE.
https://github.com/es-shims/e...

那這個Object.defineProperty 是如何產生的呢,這個是babel編譯后產生的,當我們在代碼使用 import export ES6 Module時出現的,那你可能最直接的想法就是我不用ES6 Module了,改用Commonjs規范,OK,修改后編譯,確實解決了問題,但是查看代碼里還是有一段代碼的,如下:

e.d = function(t, n, r) {
    e.o(t, n) || Object.defineProperty(t, n, {
        "configurable": !1,
        "enumerable": !0,
        "get": r
    });
}, e.n = function(t) {
    var n = t && t.__esModule ? function() {
        return t["default"];
    } : function() {
        return t;
    };
    return e.d(n, "a", n), n;
}, e.o = function(t, e) {
    return Object.prototype.hasOwnProperty.call(t, e);
}

看代碼已經做了容錯判斷。

Case Nine: Object.defineProperty 問題

重新構建,加入 json3 處理 JSON 對象兼容時,代碼在此處拋出了異常:

var hasGetter = "get" in descriptor;
var hasSetter = "set" in descriptor;
if (!supportsAccessors && (hasGetter || hasSetter)) {
    throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
}

分析supportsAccessors代碼邏輯:

var supportsAccessors = owns(prototypeOfObject, "__defineGetter__");

通過斷點調試,supportsAccessors值為false且hasGetter或者hasSetter時拋出了異常,也就是說當前js引擎不支持訪問器屬性,卻在屬性描述符中設置了get,set,那么就會拋出異常。查看 defineGetter 的兼容情況,只兼容IE11,雖然IE9、IE10同樣不支持defineGetter,不過他們直接支持Object.defineProperty方法和get語法,無需sham,所以代碼并不會走到異常這里。但是IE8以下就扯淡了。解決這種情況只能修改源代碼了。

至此,Webpack打包時,IE低版本瀏覽器(IE8及以下)遇到的兼容問題就總結這里,如果你有新的問題,歡迎留言。

感謝您的閱讀

--eof--

作者[煦涵]
2017年05月28日

下面是「FED實驗室」的微信公眾號二維碼,歡迎長按、掃描關注:

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83261.html

相關文章

  • 涵說Babel

    摘要:,下一代編譯器,當前版本,它可以處理的所有新語法,并內置了擴展及類型注解支持,如果對不是很了解可以查看實驗室微信公眾號文章煦涵說。 Babel,下一代javascript編譯器,當前版本 v2.4.0 ,它可以處理ES6的所有新語法,并內置了React JSX擴展及Flow類型注解支持,如果對Flow不是很了解可以查看FED實驗室微信公眾號文章煦涵說Flow。 Babel與JavaSc...

    lordharrd 評論0 收藏0
  • 涵說Yarn

    摘要:是一個新的包管理器,它由開發者共同開發完成。從包管理器中借鑒,創建了文件,用來記錄項目使用每個包的確切版本。感謝您的閱讀作者煦涵年月日下面是實驗室的微信公眾號二維碼,歡迎長按掃描關注 Yarn是一個新的Javascript包管理器,它由Facebook, Google, Exponent and Tilde開發者共同開發完成。Yarn 不是 NPM 的fork版本,而是它的重新設計,Y...

    pkhope 評論0 收藏0
  • 涵說Flow

    摘要:現在已經在前端比較流行的等框架中得到使用。今天煦涵就和大家一起來學習以及在實際項目中的使用。安裝這里我們選擇使用,當前你也可以使用如果你對不是很了解,建議你閱讀煦涵說。 Flow是Facebook出品的一個JavaScript代碼的靜態類型檢查工具,它做了很多處理,使您的代碼更快,更智能,更自信,更好的適應性。現在已經在前端比較流行的React 、Vue 等框架中得到使用。今天煦涵就和...

    王偉廷 評論0 收藏0
  • 涵說JSON

    摘要:對象表示法,是一種數據交換格式,能夠在服務器端交換數據,年由提出,目的是取代繁瑣笨重的格式。煦涵煦涵煦涵煦涵煦涵參考文檔感謝您的閱讀作者煦涵年月日下面是實驗室的微信公眾號二維碼,歡迎長按掃描關注 JSON(Javascript Object Notaion, javascript 對象表示法), 是一種數據交換格式,能夠在服務器端交換數據, 2001年由Douglas Crockfor...

    lowett 評論0 收藏0
  • Elasticsearch Java High Level REST Client(入門)

    摘要:入門本節描述從獲取工件到在應用程序中使用它如何開始使用高級別客戶端。保證能夠與運行在相同主版本和大于或等于的次要版本上的任何節點通信。與具有相同的發布周期,將版本替換為想要的客戶端版本。 Java High Level REST Client 入門 本節描述從獲取工件到在應用程序中使用它如何開始使用高級別REST客戶端。 兼容性 Java High Level REST Client需...

    honmaple 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<