iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >node.js中的module-alias怎么用
  • 404
分享到

node.js中的module-alias怎么用

2024-04-02 19:04:59 404人浏览 独家记忆
摘要

这篇文章主要为大家展示了“node.js中的module-alias怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“node.js中的module-alia

这篇文章主要为大家展示了“node.js中的module-alias怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“node.js中的module-alias怎么用”这篇文章吧。

首先有必要介绍一下module-alias是什么,这里有其官网链接(官网地址 https://GitHub.com/ilearNIO/module-alias)。

简单点说,module-alias提供了在node环境下的路径别名功能。一般前端开发可能会比较熟悉webpackalias配置、typescriptpaths配置等,这些都是提供了陆军别名的功能。路径别名在代码开发过程中是yyds,不然你看到这种../../../../xx路径时,是肯定会抓狂的。

使用WEBpack打包的项目webpack本身会处理源代码中路径别名的配置到打包后代码的转换过程,但是如果单纯使用typescript进行编译的项目,虽然typescript在编译过程中可以正常处理paths中路径别名的配置,但是并不会改变打包后的代码,造成在打包后的代码中仍然存在路径别名配置,看一个经过typescript编译后的代码:

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
require("./module-alias-reGISter");
var commands_1 = require("@/commands");
var package_JSON_1 = require("../package.json");
(0, commands_1.run)(package_json_1.version);

这里是tsconfig.json的配置内容

"paths": {
  "@/*": [
    "src/*"
  ]
}

可以看到在经过typescript编译后的代码中,仍然存在@符号,然而当代码运行的过程中,比如允许在node中,require并不能正常识别路径里的这个符号,导致找不到相应模块而抛出异常。

这也是module-alias这个库存在的目的。

module-alias介绍

从官网上看,这个库使用方法只需要两步,真的已经是极简状态了。

1、路径别名配置:module-alias支持两种路径别名配置方式

  • package.json中增加_moduleAliases属性进行配置

    "_moduleAliases": {
        "@": "./src"
    }
  • 通过提供的api接口addAliasaddAliasesaddPath,增加配置

    moduleAlias.addAliases({
      '@'  : __dirname + './src',
    });

2、在项目启动时首先导入该库:require(module-alias/register)即可,当然选择使用API方式的需要导入对应的函数进行处理

一般我们都是使用package.json中配置路径别名 + 项目入口处require(module-alias/register)来使用这个库。

module-alias原理介绍

module-alias通过覆写了全局对象Module上的方法_resolveFilename来实现路径别名的转换,简单来说就是通过拦截原生的_resolveFilename方法调用,进行路径别名的转换,当获取到文件的真实路径后,再调用原声的_resolveFilename方法。

下面是其源代码,基本上分为两部分:路径别名转换+原生_resolveFilename调用

var oldResolveFilename = Module._resolveFilename
Module._resolveFilename = function (request, parentModule, isMain, options) {
  for (var i = moduleAliasNames.length; i-- > 0;) {
    var alias = moduleAliasNames[i]
    if (isPathMatchesAlias(request, alias)) {
      var aliasTarget = moduleAliases[alias]
      // Custom function handler
      if (typeof moduleAliases[alias] === 'function') {
        var fromPath = parentModule.filename
        aliasTarget = moduleAliases[alias](fromPath, request, alias)
        if (!aliasTarget || typeof aliasTarget !== 'string') {
          throw new Error('[module-alias] Expecting custom handler function to return path.')
        }
      }
      request = nodePath.join(aliasTarget, request.substr(alias.length))
      // Only use the first match
      break
    }
  }

  return oldResolveFilename.call(this, request, parentModule, isMain, options)
}

看似简单的背后,往往也会踩坑

module-alias踩坑

一般我们会在node项目中使用module-alias库,因为node项目一般会从typescript转换成js代码,但是往往并不会进行打包处理,因为node项目中一般也确实不需要打包,显得有些冗余。这时候就需要module-alias上场了。

但是这个项目有点不一般,我们在项目中使用了多层代码组织方式,最外层有全局的package.json, 内层包有自己的package.json, 简单说是使用了monorepo的代码组织方式,问题也就是由此而来

module-alias无法正常解析在package.json中配置的路径别名

刚开始确实没想到是多层项目组织方式的问题,官网对module-alias/register使用有一段说明:

node.js中的module-alias怎么用

但是当时确实也是没有注意到这块说明,要不然也不会踩这个坑了,下次看使用说明要仔细了,不过这么长的使用说明,大概率还是不会看的这么仔细。。。毕竟看起来这么简单的使用方法,好像似乎是不会出什么问题的吧

module-alias/register流程

既然踩坑了,就有必要了解一下踩坑的原因,避免反复踩坑才好。可以详细了解下module-aliasinit方法的实现。为了节省篇幅,省略了部分细节

function init (options) {
  // 省略了部分内容
  var candidatePackagePaths
  if (options.base) {
    candidatePackagePaths = [nodePath.resolve(options.base.replace(/\/package\.json$/, ''))]
  } else {
    // There is probably 99% chance that the project root directory in located
    // above the node_modules directory,
    // Or that package.json is in the node process' current working directory (when
    // running a package manager script, e.g. `yarn start` / `npm run start`)
    // 重点看这里!!!
    candidatePackagePaths = [nodePath.join(__dirname, '../..'), process.cwd()]
  }
  var npmPackage, base
  for (var i in candidatePackagePaths) {
    try {
      base = candidatePackagePaths[i]
      npmPackage = require(nodePath.join(base, 'package.json'))
      break
    } catch (e) { // noop }
  }
  // 省略了部分内容
  var aliases = npmPackage._moduleAliases || {}
  for (var alias in aliases) {
    if (aliases[alias][0] !== '/') {
      aliases[alias] = nodePath.join(base, aliases[alias])
    }
  }
  // 省略了部分内容
}

可以看重点部分,如果我们没有给base参数,module-alias默认会从../../目录和当前目录下找寻package.json文件,而且../..目录下的package.json文件的优先级比当前目录下的优先级还要高,这里的优先级设置似乎和正常的优先级逻辑有点差别,一般都会让当前目录的优先级比较高才比较符合正常逻辑,所以会导致加载的不是当前目录下的package.json文件,而导致找不到路径别名配置而出错。

关于这点似乎有不少人踩坑了,还有人提了issues,但是似乎暂时并没有人回应。

解决办法

通过API方式注册路径别名,或者手动调用init方法,传入base参数,指定package.json文件.

以上是“node.js中的module-alias怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网node.js频道!

--结束END--

本文标题: node.js中的module-alias怎么用

本文链接: https://www.lsjlt.com/news/87847.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • node.js中的module-alias怎么用
    这篇文章主要为大家展示了“node.js中的module-alias怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“node.js中的module-alia...
    99+
    2024-04-02
  • Linux中alias命令怎么用
    这篇文章将为大家详细讲解有关Linux中alias命令怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在Linux系统中执行一条很长的命令挺麻烦的,我们可以在.bashrc文件下设置alias,对命令...
    99+
    2023-06-28
  • Node.JS中的模块、exports和module讲解
    目录模块核心模块文件模块基本数据类型引用数据类型exports和module.exports的关系模块 分为两大类 核心模块 由node引擎提供的模块核心模块的标识就是模块的名字 v...
    99+
    2023-01-11
    node.js模块 exports和module node.js exports和module
  • Linux的alias命令怎么用
    这篇文章将为大家详细讲解有关Linux的alias命令怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Linux alias命令用于设置指令的别名,用户可利用alias,自定指令的别名。若仅输入ali...
    99+
    2023-06-27
  • idea中的project、module、artifact怎么用
    小编给大家分享一下idea中的project、module、artifact怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!idea中没有工作空间的概念,每一个项目都是一个工作空间,所以我们打开一个新的项目时往往都要配...
    99+
    2023-06-29
  • python中的module和package怎么用
    这篇文章主要介绍“python中的module和package怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python中的module和package怎么用”文章能帮助大家解决问题。在 pa...
    99+
    2023-06-30
  • ES6中怎么使用module
    这篇文章主要介绍“ES6中怎么使用module”,在日常操作中,相信很多人在ES6中怎么使用module问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ES6中怎么使用modu...
    99+
    2024-04-02
  • Linux中的export与alias命令怎么使用
    这篇文章主要讲解了“Linux中的export与alias命令怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux中的export与alias命令怎么使用”吧!摘要:export...
    99+
    2023-07-05
  • Linux的alias命令怎么使用
    这篇文章主要介绍了Linux的alias命令怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux的alias命令怎么使用文章都会有所收获,下面我们一起来看看吧。Linux系统提供了一个有用的工具叫a...
    99+
    2023-06-27
  • Linux alias命令怎么用
    本文小编为大家详细介绍“Linux alias命令怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Linux alias命令怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Linux系统中alias命令...
    99+
    2023-06-28
  • module怎么在python中使用
    今天就跟大家聊聊有关module怎么在python中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相...
    99+
    2023-06-14
  • Node.js中的eventloop怎么用
    这篇文章主要讲解了“Node.js中的eventloop怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Node.js中的eventloop怎么用”吧!...
    99+
    2024-04-02
  • node.js中的EventEmitter怎么用
    今天小编给大家分享一下node.js中的EventEmitter怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,...
    99+
    2024-04-02
  • eclipse中的module怎么创建
    在Eclipse中创建模块的步骤如下:1. 打开Eclipse,点击菜单栏的“File” -> “New” -> “Project”...
    99+
    2023-08-26
    eclipse module
  • Linux常用命令alias怎么用
    这篇文章主要为大家展示了“Linux常用命令alias怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux常用命令alias怎么用”这篇文章吧。Linux常用命令alias命令用于设置...
    99+
    2023-06-28
  • shell中alias命令的使用
    目录0.什么是alias1.Shell alias2.使用 unalias 命令删除别名0.什么是alias 设置指令的别名,用户可利用alias,自定指令的别名。若仅输入alias,则可列出目前所有的别名设置。alia...
    99+
    2023-06-10
    Shell alias
  • CentOS中alias命令的作用是什么
    CentOS中alias命令的作用是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Alias命令功能描述:我们在进行系统的管理工作一定会有一些我们经常固定使用,但又很长的命...
    99+
    2023-06-10
  • linux中alias命令使用失效怎么解决
    要解决Linux中alias命令使用失效的问题,可以尝试以下几个方法: 检查shell配置文件:确认你所使用的shell的配置文...
    99+
    2023-10-23
    linux
  • Node.js中Stream怎么用
    这篇文章主要为大家展示了“Node.js中Stream怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Node.js中Stream怎么用”这篇文章吧。一、什...
    99+
    2024-04-02
  • Node.js中的cluster怎么使用
    本文小编为大家详细介绍“Node.js中的cluster怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Node.js中的cluster怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。当初使用 cl...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作