require['context'] 与 require.context——上
写得很扎实!结合你项目里的实际用法,我补充几点校对与进阶建议,帮你把这份笔记打磨得更完善:
-
语法等价说明
- require['context'] 与 require.context 是等价的,项目里选择方括号写法通常是为了规避某些 lint 规则或静态分析限制。
-
directory 的路径基准
- 你文档里写“路径是相对于当前文件的”这句话在使用相对路径时成立(必须以 ./ 或 ../ 开头),但在本项目里用的是 Webpack alias @,因此会按 alias 配置解析到 src 目录。也就是说:
- 相对写法:require.context('./components', true, ...) 相对当前文件
- alias 写法:require.context('@/components', true, ...) 基于别名映射(本项目即此种用法)
- 你文档里写“路径是相对于当前文件的”这句话在使用相对路径时成立(必须以 ./ 或 ../ 开头),但在本项目里用的是 Webpack alias @,因此会按 alias 配置解析到 src 目录。也就是说:
-
第三个参数 regExp 的匹配对象
- 匹配对象是 context 目录下每个文件的“请求字符串”,形如 ./ModuleManage/index.js、./PageParams/index.js。你在
使用的正则 /[A-Za-z]\w+.(vue|js)$/ 会匹配末尾文件名为 Xxx.vue 或 Xxx.js(包含 index.js)。这正是为了: - 遍历 index.js 读取模块配置
- 同时让 Setting.vue 能被 keys() 收集到,以便后续检查 has_setting
- 匹配对象是 context 目录下每个文件的“请求字符串”,形如 ./ModuleManage/index.js、./PageParams/index.js。你在
-
返回对象的能力点补充
- 你已经列出 keys、resolve、id。可以加一句“返回函数本身用于按 key 动态导入模块”,例如:
- const mod = context('./ModuleManage/index.js'),对于 .vue/.js 默认导出要用 mod.default
- 你已经列出 keys、resolve、id。可以加一句“返回函数本身用于按 key 动态导入模块”,例如:
-
与项目代码的结合说明(更贴近落地)
- 在
与 中: - 用 keys() 获取所有匹配文件
- 只处理 index.js:if (fileName.indexOf('index.js') === -1) return
- 使用 context(fileName).default 读取配置
- 再根据 keys() 是否存在 XxxSetting.vue 来设置 has_setting
- 最终将对象转成数组并按 sort 排序返回
- 在
-
常见坑与优化建议
- 只在必要目录建立 context,避免过宽的匹配导致包体积增大(你文档已有提醒,可以强调“正则和目录范围尽量精确”)
- 不能把 directory 或 regExp 写成动态变量(Webpack 需要静态分析)
- 如果需要只收集 .vue 下的 Setting 文件,可将正则细化,例如 /.(vue|js)$/ 保留,再在逻辑上更严格区分 index.js 与 Setting.vue
- 若使用 TypeScript,.vue/.js 的 default 导出类型可做显式约束,便于 IDE 联想和类型检查
-
生态兼容提示
- 你已标注“只能在 Webpack 环境下使用”。再补一句迁移方案:在 Vite/Rollup 环境通常使用 import.meta.glob 作为替代。
-
调试建议(与 eslint 兼容)
- 避免 debugger 触发 no-debugger,可在 return 前加仅开发环境的日志:
- if (process.env.NODE_ENV !== 'production')
- 或者在调用方打印(例如初始化后打印 store 中的 modules/accessories)。
- 避免 debugger 触发 no-debugger,可在 return 前加仅开发环境的日志:
如果你愿意,我可以把这些增补点整合到你这份 Markdown 里,形成一版“贴合本项目”的最终稿,以后直接复用。你更倾向于精简版还是详细版?
本文来自博客园,作者:jialiangzai,转载请注明原文链接:https://www.cnblogs.com/zsnhweb/p/19059160

浙公网安备 33010602011771号