成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

webpack配置別名alias出現(xiàn)的錯(cuò)誤匹配

1fe1se / 3284人閱讀

摘要:的匹配問(wèn)題初現(xiàn)在中,通過(guò)設(shè)置屬性可以配置查找模塊的基路徑,也可以設(shè)置搜索的模塊后綴名,當(dāng)然,最后一個(gè)就是我們要講的別名設(shè)置。深入源碼之先貼上部分源碼這段簡(jiǎn)單的代碼所做的就是針對(duì)別名做映射,獲取到對(duì)應(yīng)的模塊。修改非常簡(jiǎn)單,進(jìn)行嚴(yán)格相等的判斷

@(webpack)

webpack是一款功能強(qiáng)大的前端構(gòu)建工具,不僅僅是針對(duì)js,它也可通過(guò)各種loader來(lái)構(gòu)建相關(guān)的less,html,image等各種資源,將webpack配合流程制定工具gulp結(jié)合起來(lái),則更為方便的自定義工作流程。

[TOC]

webpack的alias匹配問(wèn)題初現(xiàn)

在webpack.config.js中,通過(guò)設(shè)置resolve屬性可以配置查找“commonJS/AMD模塊”的基路徑,也可以設(shè)置搜索的模塊后綴名,當(dāng)然,最后一個(gè)就是我們要講的別名alias設(shè)置。

跟蹤問(wèn)題

在模塊開(kāi)發(fā)過(guò)程中,我們可能會(huì)對(duì)可以復(fù)用的組件封裝成一個(gè)可被git管控的模塊,并在引用的過(guò)程中采用帶版本號(hào)的方式引用,這就要求我們?cè)趙ebpack.config.js中添加相關(guān)alias配置,如

...
module.exports = {
    entry: {
        main: "index.js"
    },
    output: {
        path: "build"
        filename: "[name].js"
    },
    resolve: {
        root: "modules"
        alias: {
            "mod/slider": "/path/mods/mod/slider/0.0.5",
            "mod/footer": "/path/mods/mod/footer/0.0.2",
            "mod/slider/0.0.3": "/path/mods/mod/slider/0.0.3",
            "mod/header": "/path/mods/mod/header/0.0.1",
            "mod/slider/0.0.1": "/path/mods/mod/slider/0.0.1"
        }    
    }
}

有一個(gè)簡(jiǎn)單的需求,即在index.js中,可這樣引用:

var slider = require("mod/slider");
var sliderV3 = require("mod/slider/0.0.3");
var sliderV1 = require("mod/slider/0.0.1");

結(jié)果和我們預(yù)想的會(huì)有不同,webpack的別名處理邏輯會(huì)使這三個(gè)變量的引用都為 slider這個(gè)變量所對(duì)應(yīng)的模塊,要想解決這種情況,只能深入源碼。

深入源碼之ModuleAliasPlugin

先貼上部分源碼:

    var aliasMap = this.aliasMap;
    resolver.plugin("module", function(request, callback) {
        var fs = this.fileSystem;
        var keys = Object.keys(aliasMap);
        var i = 0;
        (function next() {
            for(;i < keys.length; i++) {
                var aliasName = keys[i];
                var onlyModule = /$$/.test(aliasName);
                if(onlyModule) aliasName = aliasName.substr(0, aliasName.length-1);
                if((!onlyModule && request.request.indexOf(aliasName + "/") === 0) || request.request === aliasName) {
                    var aliasValue = aliasMap[keys[i]];
                    if(request.request.indexOf(aliasValue + "/") !== 0 && request.request != aliasValue) {
                        var newRequestStr = aliasValue + request.request.substr(aliasName.length);
                        var newRequest = this.parse(newRequestStr);
                        var obj = {
                            path: request.path,
                            request: newRequest.path,
                            query: newRequest.query,
                            directory: newRequest.directory
                        };
                        var newCallback = createInnerCallback(callback, callback, "aliased with mapping " + JSON.stringify(aliasName) + ": " + JSON.stringify(aliasValue) + " to " + newRequestStr);
                        if(newRequest.module) return this.doResolve("module", obj, newCallback);
                        if(newRequest.directory) return this.doResolve("directory", obj, newCallback);
                        return this.doResolve(["file", "directory"], obj, newCallback);
                    }
                }
            }
            return callback();
        }.call(this));

這段簡(jiǎn)單的代碼所做的就是針對(duì)別名做映射,獲取到對(duì)應(yīng)的模塊。
之所以出現(xiàn)上節(jié)的問(wèn)題,就是因?yàn)檫@句判斷

if(request.request.indexOf(aliasValue + "/") !== 0 && request.request != aliasValue)

webpack的作者貌似有些多此一舉了,或者說(shuō)是在我們的應(yīng)用場(chǎng)景中并沒(méi)有考慮到,所以僅僅針對(duì)這個(gè)判斷進(jìn)行修改就可以滿足需求。修改非常簡(jiǎn)單,進(jìn)行嚴(yán)格相等的判斷:

if(request.request != aliasValue)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/78457.html

相關(guān)文章

  • webpack 從入門到上線

    webpack 是什么 showImg(https://segmentfault.com/img/bVzLhA?w=2598&h=1299); 一項(xiàng)技術(shù)、一個(gè)工具的出現(xiàn),肯定是為了解決問(wèn)題的。那么,webpack 是為了解決什么問(wèn)題?答案是:文件依賴管理。瀏覽器端的 Js, 出于安全的考慮,對(duì)本地文件沒(méi)有操作權(quán)限,不能引用其它 js, css 等文件。而 webpack 就是用來(lái)解決這個(gè)問(wèn)題的,讓...

    Yumenokanata 評(píng)論0 收藏0
  • webpack學(xué)習(xí)筆記

    摘要:運(yùn)行該語(yǔ)句會(huì)執(zhí)行如下步驟使用進(jìn)行文件壓縮。設(shè)置環(huán)境變量,觸發(fā)某些包,以不同的方式進(jìn)行編譯。在原始的源碼中執(zhí)行查找和替換操作。等同于表示任何出現(xiàn)的地方都會(huì)被替換為。提供函數(shù)用來(lái)合并配置對(duì)象當(dāng)文件小于限制,會(huì)返回。 選項(xiàng) 1.devtool:通過(guò)在瀏覽器調(diào)試工具(browser devtools)中添加元信息(meta info)增強(qiáng)調(diào)試。 2.resolve.alias:創(chuàng)建 impor...

    Soarkey 評(píng)論0 收藏0
  • WEBPACK

    摘要:主要輸出文件的默認(rèn)值是,其他生成文件默認(rèn)放置在文件夾中。讓能夠去處理其他類型的文件,并將它們轉(zhuǎn)換為有效模塊,以供應(yīng)用程序使用,以及被添加到依賴圖中。屬性,表示進(jìn)行轉(zhuǎn)換時(shí),應(yīng)該使用哪個(gè)。 本質(zhì)上,webpack 是一個(gè)現(xiàn)代 JavaScript 應(yīng)用程序的靜態(tài)模塊打包工具。當(dāng) webpack 處理應(yīng)用程序時(shí),它會(huì)在內(nèi)部構(gòu)建一個(gè) 依賴圖(dependency graph),此依賴圖會(huì)映射項(xiàng)...

    Turbo 評(píng)論0 收藏0
  • vue-router 一些容易被忽略知識(shí)點(diǎn)

    摘要:調(diào)用全局的守衛(wèi)。在被激活的組件里調(diào)用。用創(chuàng)建好的實(shí)例調(diào)用守衛(wèi)中傳給的回調(diào)函數(shù)。 本文適用于對(duì) Vue.js 和 vue-router 有一定程度了解的開(kāi)發(fā)者除特殊說(shuō)明,vue-router 版本為 3.0.2 正文 路由 class 匹配 路由匹配后會(huì)給該標(biāo)簽添加 class 屬性值 .router-link-active,該功能在嵌套路由中十分方便 class 的實(shí)際屬性值可以通...

    chunquedong 評(píng)論0 收藏0
  • webpack配置

    摘要:配置無(wú)入口的在輸出時(shí)的文件名稱。配置發(fā)布到線上資源的前綴,為類型。則是用于配置這個(gè)異步插入的標(biāo)簽的值。配置以何種方式導(dǎo)出庫(kù)。是字符串的枚舉類型,支持以下配置。在為時(shí),配置將沒(méi)有意義。是可選配置項(xiàng),類型需要是其中一個(gè)。 webpack配置 查看所有文檔頁(yè)面:全棧開(kāi)發(fā),獲取更多信息。原文鏈接:第2章 配置,原文廣告模態(tài)框遮擋,閱讀體驗(yàn)不好,所以整理成本文,方便查找。 配置 Webpack...

    Doyle 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<