摘要:我們按照提供的思路,對(duì)路由按業(yè)務(wù)模塊進(jìn)行拆分。這時(shí)就可以使用到了打包入口文件自動(dòng)引入子目錄下所有文件參考分享使用的實(shí)現(xiàn)路由去中心化管理之用法的基礎(chǔ)組件的自動(dòng)化全局注冊(cè)官方文檔
概述
You can create your own context with the require.context() function.
It allows you to pass in a directory to search, a flag indicating whether subdirectories should be searched too, and a regular expression to match files against.
webpack parses for require.context() in the code while building.
webpack文檔 - require.context
require.context是webpack中,用來(lái)創(chuàng)建自己的(模塊)上下文;解析
webpack會(huì)在代碼構(gòu)建的時(shí)候去解析該函數(shù)
require.context(directory, useSubdirectories = false, regExp = /^.//);
該方法有3個(gè)參數(shù):
需要搜索的文件夾目錄(必傳)
是否需要搜索它的子孫目錄,默認(rèn)為false
匹配文件名的正則表達(dá)式
例子// 示例 const test = require.context("./string", false, /.js$/);
我的目錄結(jié)構(gòu)如下:
String
trim.js
trimLeft.js
trimRight.js
test
test1.js
*
這時(shí)候如果console.log(test),就會(huì)發(fā)現(xiàn)調(diào)用require.context之后返回的是一個(gè)函數(shù)
webpackContext(req) { var id = webpackContextResolve(req); return __webpack_require__(id); }
這次如果還需要深入就需要去webpack打包之后的文件中尋找了:
var map = { "./test/test1.js": "./src/string/test/test1.js", "./trim.js": "./src/string/trim.js", "./trimLeft.js": "./src/string/trimLeft.js", "./trimRight.js": "./src/string/trimRight.js" }; function webpackContext(req) { var id = webpackContextResolve(req); return __webpack_require__(id); } function webpackContextResolve(req) { var id = map[req]; if(!(id + 1)) { // check for number or string var e = new Error("Cannot find module "" + req + """); e.code = "MODULE_NOT_FOUND"; throw e; } return id; } webpackContext.keys = function webpackContextKeys() { return Object.keys(map); }; webpackContext.resolve = webpackContextResolve; module.exports = webpackContext; webpackContext.id = "./src/string sync recursive .js$";
由上面的代碼可以看出,在webpackContext定義了多個(gè)方法和屬性
console.log(webpackContext.id) // "./src/string sync recursive .js$" console.log(webpackContext("./trim.js")) // "./src/string/trim.js" console.log(webpackContext.keys()) // ["./test/test1.js", "./trim.js", "./trimLeft.js", "./trimRight.js"]使用場(chǎng)景 vue中的基礎(chǔ)組件的自動(dòng)化全局注冊(cè)
具體就不多說(shuō)了,直接看文檔
vue官方文檔 - 基礎(chǔ)組件的自動(dòng)化全局注冊(cè)
當(dāng)你的單頁(yè)應(yīng)用變成了大型應(yīng)用后,路由也在慢慢的增多
// rootRoute.js const rootRoute = { childRoutes: [ { path: "/", component: AppLayout, childRoutes: [ { path: "shop", // 購(gòu)買詳情頁(yè) component: ShopLayout, childRoutes: [ { path: "foodDetail", component: FoodDetail }, { path: "shoesDetail", component: ShoesDetail } // 其他 ] }, { path: "order", // 訂單頁(yè) component: Order, childRoutes: [ { path: "remark", //訂單備注 component: Remark }, { path: "invoice", //發(fā)票抬頭 component: Invoice }, { path: "payment", //付款頁(yè)面 component: Payment }, { path: "userValidation", //用戶驗(yàn)證 component: UserValidation }, { path: "chooseAddress", //選擇地址 component: ChooseAddress, childRoutes: [ { path: "addAddress", //添加地址 component: AddAddress, childRoutes: [ { path: "searchAddress", //搜索地址 component: SearchAddress } ] } ] } ] } // ... // 大量新增路由 // ... ] } ] };
當(dāng)路由變的越來(lái)越大,大到已經(jīng)難以維護(hù)時(shí)。我們按照react-router提供的思路,對(duì)路由按業(yè)務(wù)模塊進(jìn)行拆分。
// rootRoute.js const rootRoute = { childRoutes: [ { path: "/", component: AppLayout, childRoutes: [ require("./modules/shop/route"), //購(gòu)買詳情頁(yè) require("./modules/order/route"), // 訂單頁(yè) require("./modules/login/route"), // 登錄注冊(cè)頁(yè) require("./modules/service/route"), // 服務(wù)中心 // ... // 其他大量新增路由 // ... ] } ] };
再進(jìn)一步優(yōu)化的話,就可以使用require.context
const rootRoute = { childRoutes: [ { path: "/", component: AppLayout, childRoutes: (r => { return r.keys().map(key => r(key)); })(require.context("./", true, /^./modules/((?!/)[sS])+/route.js$/)) } ] };自動(dòng)引用目錄下的文件
比如我現(xiàn)在想要造一個(gè)自己的工具庫(kù)utils,那么隨著工具函數(shù)數(shù)量的增加,勢(shì)必需要將代碼分割得更小,甚至細(xì)化到一個(gè)工具函數(shù)對(duì)應(yīng)一個(gè)js文件。
這時(shí)如果還需要在入口js文件中一個(gè)個(gè)手動(dòng)引用,那么每增加一個(gè)js文件,就需要重新去修改入口js一次,工程量是非常大的。
這時(shí)就可以使用到require.context了~
/** * @desc webpack打包入口文件 * @example 自動(dòng)引入子目錄下所有js文件 */ let moduleExports = {}; const r = require.context("./", true, /^./.+/.+.js$/); r.keys().forEach(key => { let attr = key.substring(key.lastIndexOf("/") + 1, key.lastIndexOf(".")); moduleExports[attr] = r(key); }); module.exports = moduleExports;參考
分享:使用 webpack 的 require.context 實(shí)現(xiàn)路由“去中心化”管理
webpack 之 require.context 用法
vue的基礎(chǔ)組件的自動(dòng)化全局注冊(cè)
webpack官方文檔 - require-context
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/99443.html
摘要:可以做做不到的事情。看完這段代碼就不難理解文檔中所說(shuō)的會(huì)返回一個(gè)帶有個(gè)的函數(shù)了。進(jìn)階深入探究源碼我們知道在版本后,在加載模塊時(shí),可以指定模塊加載模式,我們能使用幾種方式來(lái)控制我們要加載的模塊。 前言 require.context 其實(shí)是一個(gè)非常實(shí)用的 api。但是 3-4 年過(guò)去了,卻依舊還有很多人不知道如何使用。 而這個(gè) api 主要為我們做什么樣的事情?它可以幫助我們動(dòng)態(tài)加載我們...
摘要:原文發(fā)布與抹橋的博客翻譯向指南上前置定義代碼包代碼塊安裝代碼分割代碼分割是中最引人注目的功能之一。回調(diào)函數(shù)一個(gè)回調(diào)函數(shù)會(huì)被執(zhí)行一次當(dāng)所有依賴都被加載以后。對(duì)象的實(shí)現(xiàn)作為一個(gè)參數(shù)傳遞給這個(gè)回調(diào)函數(shù)。 原文發(fā)布與 抹橋的博客 -【翻譯向】webpack2 指南(上) 前置定義 Bundle 代碼包Chunk 代碼塊 安裝 npm install webpack --save-dev 代碼分...
摘要:依賴管理該條已在中文網(wǎng)存在,點(diǎn)擊這里表達(dá)式來(lái)調(diào)用當(dāng)你的請(qǐng)求包含表達(dá)式,那個(gè)一個(gè)上下文環(huán)境將被創(chuàng)建。一個(gè)包含所有父文件夾和子及后代文件夾中以結(jié)尾的文件的上下文。一個(gè)函數(shù),返回一個(gè)數(shù)組,包含上下文模塊能夠處理的所有的請(qǐng)求。 依賴管理 Dependency Management 該條已在webpack2.x中文網(wǎng)存在,點(diǎn)擊這里 es6 modules commonjs amd 表達(dá)式...
摘要:直到最近在使用微信機(jī)器人時(shí),遇到了強(qiáng)烈的需求。增刪文件后熱更新上面的代碼已經(jīng)不小心實(shí)現(xiàn)了增加文件后熱更新,因?yàn)楸硎緳z測(cè)的更新,如果增加一個(gè),那么就變成,于是新模塊不等于老模塊不存在,從而使用注冊(cè)事件監(jiān)聽器。 背景 剛思考這個(gè)話題的時(shí)候,首先想到的是 Vue 或 React 的組件熱更新(基于 Webpack HMR),后來(lái)又想到了 Lua、Erlang 等語(yǔ)言的熱更新,不過(guò)在實(shí)際開發(fā) ...
摘要:需求背景是這樣,下有個(gè)文件,在中導(dǎo)出所有的文件,需要做到在新增文件時(shí),自動(dòng)引入到中。 需求背景是這樣,./api/modules/下有n個(gè)js文件,在./api/index中導(dǎo)出所有modules的js文件,需要做到在modules新增js文件時(shí),自動(dòng)引入到./api/index中。因?yàn)樵诰W(wǎng)上找不到好的解決方案,只能自己動(dòng)手了 那么我就需要一個(gè)可以需求所有文件列表的api,也就是req...
閱讀 3454·2021-11-22 12:00
閱讀 671·2019-08-29 13:24
閱讀 2905·2019-08-29 11:31
閱讀 2587·2019-08-26 14:00
閱讀 3185·2019-08-26 11:42
閱讀 2476·2019-08-23 18:31
閱讀 798·2019-08-23 18:27
閱讀 2844·2019-08-23 16:58