如何在任意目录脚本中获取其他任意文件对应的Node包搜索路径
解决方案
最优实现方案(基于Node官方公开API)
无需手动实现路径逻辑,也无需跨目录执行脚本,直接使用Node内置的createRequireAPI即可生成对应目录的模块搜索路径,输出结果与在目标目录下直接执行原生require.resolve.paths的结果完全一致,支持Node v12.2.0及以上版本。
代码示例
import { createRequire } from 'module' import * as path from 'path' // 替换为y.ts实际所在的绝对目录路径 const yFileDir = path.resolve('/path/to/directory-of-y-ts') // 构造以y.ts所在目录为基准的require函数 const requireFromYDir = createRequire(path.join(yFileDir, 'entry.js')) // 直接获取y.ts对应的完整Node模块搜索路径 const yModuleSearchPaths = requireFromYDir.resolve.paths('') // 打印验证结果 console.log(JSON.stringify(yModuleSearchPaths, null, 2))
低版本Node兼容方案
如果使用的Node版本低于v12.2.0,可以调用Node内置module模块的内部方法实现,该逻辑为Node模块系统原生使用的路径生成逻辑,兼容性覆盖所有主流Node版本:
import * as path from 'path' import { Module } from 'module' const yFileDir = path.resolve('/path/to/directory-of-y-ts') // 生成目标目录对应的逐级node_modules搜索路径 const localSearchPaths = Module._nodeModulePaths(yFileDir) // 拼接全局模块搜索路径,与原生逻辑对齐 const fullSearchPaths = localSearchPaths.concat(Module.globalPaths) console.log(JSON.stringify(fullSearchPaths, null, 2))
注意事项
- TypeScript环境下需要提前安装
@types/node依赖获取类型定义,避免类型报错 - 如果y.ts路径是动态获取的,只需要调用
path.dirname(yTsAbsolutePath)即可拿到y.ts的目录路径传入上述代码
内容的提问来源于stack exchange,提问作者Craig Hicks
相关产品推荐
相关产品推荐

