路径别名

优质
小牛编辑
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 目录。