构建时动态加载JSON文件:path.join结果无法用于require问题求助
解决require无法识别path.join生成路径的问题
这问题我太熟了!其实根源不在const声明上,而是模块打包工具(比如你用的Webpack)对require的处理逻辑导致的👇
为什么path.join不行?
模块打包工具(包括Node.js的原生模块系统在编译场景下)需要在编译阶段就能确定require的路径,这样才能提前把依赖的文件打包进最终产物里。而path.join('schemas', url, 'schema.json')是在运行时才计算出具体路径的,打包工具没办法提前预知这个路径对应的文件,自然就没法正确解析。
反观你手动用+拼接的写法,因为你的URLS是固定的静态数组,打包工具能通过静态分析推断出所有可能的路径,所以就能正常加载对应的schema文件。
可行的解决方案
方案1:改用模板字符串保持静态可分析性
如果不想改太多现有代码,你可以把path.join换成模板字符串,只要URLS是静态数组,打包工具就能识别出所有可能的路径:
const URLS = [ '/register', '/login' ]; const URL_TO_SCHEMA_MAP = URLS.map(url => { const result = {}; // 用模板字符串拼接路径,保持静态可分析性 const schemaPath = `schemas${url}/schema.json`; const schema = require(`json-loader!./${schemaPath}`); result[url] = schema; return result; }).reduce((obj1, obj2) => Object.assign(obj1, obj2));
方案2:用require.context批量导入(更推荐)
对于这种批量加载目录文件的场景,Webpack提供的require.context是更优雅的方案,还能自动适配新增的schema目录,不用手动维护URLS数组:
// 创建上下文:遍历./schemas目录下所有子目录,匹配schema.json文件 const schemaContext = require.context('./schemas', true, /\/schema\.json$/); const URL_TO_SCHEMA_MAP = schemaContext.keys().reduce((map, key) => { // 从文件路径中提取对应的URL,比如"./register/schema.json" => "/register" const url = key.replace(/^\.(\/.*)\/schema\.json$/, '$1'); map[url] = schemaContext(key); return map; }, {});
以后你新增/forget-password这类路径的schema,只要按现有目录结构放好schema.json,这个映射对象会自动包含新的条目。
补充说明
你疑惑的const变量问题:const只是保证变量不会被重新赋值,但变量的具体值还是在运行时计算出来的。打包工具判断的是require的参数能不能在编译阶段确定,跟变量的声明方式没有关系哦~
内容的提问来源于stack exchange,提问作者user2146414
相关产品推荐
相关产品推荐

