摘要:的匹配問(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
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)題的,讓...
摘要:運(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...
摘要:主要輸出文件的默認(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)...
摘要:調(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í)際屬性值可以通...
摘要:配置無(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...
閱讀 1927·2021-11-22 09:34
閱讀 1158·2021-10-09 09:44
閱讀 3051·2021-09-29 09:35
閱讀 3628·2021-09-14 18:01
閱讀 1497·2021-08-16 10:49
閱讀 1097·2019-08-29 14:11
閱讀 861·2019-08-29 12:47
閱讀 3082·2019-08-26 13:47