路径别名
优质
小牛编辑
137浏览
2023-12-01
定义统一路径别名 module-alias
文档:https://www.npmjs.com/package/module-alias
在 egg.js 中使用
安装:npm install module-alias --save
使用:package.json 中添加
"_moduleAliases": {
"@root": ".",
"@app": "app"
},
app.js 启动项中引入
configWillLoad() {
// 此时 config 文件已经被读取并合并,但是还并未生效
// 这是应用层修改配置的最后时机
// 注意:此函数只支持同步调用
require('module-alias/register');
// 例如:参数中的密码是加密的,在此处进行解密
// 例如:插入一个中间件到框架的 coreMiddleware 之间
}
文件中使用,以下代表根路径下的 app/exceptions/http_exceptions.js
文件
const { HttpExceptions } = require('@app/exceptions/http_exceptions');
module-alias
在 NodeJS 中注册自定义模块路径,在节点中不再有像这样的垃圾编码路径:
require('../../../../some/very/deep/module')
只需创建一个别名并以正确的方式执行:
var module = require('@deep/module') // Or ES6 import module from '@deep/module'
它还允许您注册目录,这些目录的作用就像node_modules但是使用您自己的私有模块,以便您可以直接访问它们:
require('my_private_module'); // Or ES6 import module from 'my_private_module'
警告:此模块不应用于其他NPM模块,因为它修改了默认的require行为,它被设计用于开发最终项目,如网站、应用程序等。
使用
将自定义配置添加到 package.json,在应用程序的根目录中。
// Aliases "_moduleAliases": { "@root" : ".", // Application's root "@deep" : "src/some/very/deep/directory/or/file", "@my_module" : "lib/some-file.js", "something" : "src/foo", // Or without @. Actually, it could be any string } // Custom module directories, just like `node_modules` but with your private modules (optional) "_moduleDirectories": ["node_modules_custom"],
然后在应用程序的主文件中,在任何代码之前添加这一行
require('module-alias/register')
现在你可以做这样的事情:
require('something') const module = require('@root/some-module') const veryDeepModule = require('@deep/my-module') const customModule = require('my_private_module') // module from `node_modules_custom` directory // Or ES6 import 'something' import module from '@root/some-module' import veryDeepModule from '@deep/my-module' import customModule from 'my_private_module' // module from `node_modules_custom` directory
高级使用
如果您不想修改 package.json
或者您只是更喜欢以编程的方式设置所有这些,然后您可以使用以下方法:
addAlias('alias', 'target_path')
- 注册一个别名addAliases({ 'alias': 'target_path', ... })
- 注册多个别名addPath(path)
- 注册自定义模块目录,类似于 node_modules,但使用您自己的模块
const moduleAlias = require('module-alias') // // Register alias // moduleAlias.addAlias('@client', __dirname + '/src/client') // Or multiple aliases moduleAlias.addAliases({ '@root' : __dirname, '@client': __dirname + '/src/client', ... }) // Custom handler function (starting from v2.1) moduleAlias.addAlias('@src', (fromPath, request, alias) => { // fromPath - Full path of the file from which `require` was called // request - The path (first argument) that was passed into `require` // alias - The same alias that was passed as first argument to `addAlias` (`@src` in this case) // Return any custom target path for the `@src` alias depending on arguments if (fromPath.startsWith(__dirname + '/others')) return __dirname + '/others' return __dirname + '/src' }) // // Register custom modules directory // moduleAlias.addPath(__dirname + '/node_modules_custom') moduleAlias.addPath(__dirname + '/src') // // Import settings from a specific package.json // moduleAlias(__dirname + '/package.json') // Or let module-alias to figure where your package.json is // located. By default it will look in the same directory // where you have your node_modules (application's root) moduleAlias()
webpack 用法
webpack 有一个内置的别名和自定义模块目录支持,所以它很容易使它在客户端工作。
// webpack.config.js const npm_package = require('./package.json') module.exports = { entry: { ... }, resolve: { root: __dirname, alias: npm_package._moduleAliases || {}, modules: npm_package._moduleDirectories || [] // eg: ["node_modules", "node_modules_custom", "src"] } }
它是怎么工作的?
为了注册别名,它修改内部 Module._resolveFilename
方法,以便当您使用 require
或 import
它首先检查给定的字符串是否以一个已注册的别名开头,如果是,它会用别名的目标路径替换字符串中的别名。
为了注册自定义模块路径 (addPath
)修改内部 Module._nodeModulePaths
方法,从而使给定目录的作用类似于node_modules
目录。