使用Node.js中的相对路径导入ES模块

使用Node.js中的相对路径导入ES模块,node.js,es6-modules,mjs,Node.js,Es6 Modules,Mjs,过去,每当我想在Node.js应用程序中拥有相对路径时,我都会使用app module path。如果我通过.mjs格式使用ES模块,在某个目录路径变为相对路径时,我如何具有相同的功能 另一方面,我是否可以将别名分配给目录,使所有相对路径都相对于该别名,就像/是相对于当前目录的路径的别名一样。可以通过内置的猴子补丁为加载了require的CommonJS模块的某些路径指定别名模块模块 ES模块提供了一种通过指定来更改模块加载行为的方法,如中所述 这样,根源路径(将相对加载程序位置指定)可以映射到

过去,每当我想在Node.js应用程序中拥有相对路径时,我都会使用
app module path
。如果我通过
.mjs
格式使用ES模块,在某个目录路径变为相对路径时,我如何具有相同的功能


另一方面,我是否可以将别名分配给目录,使所有相对路径都相对于该别名,就像
/
是相对于当前目录的路径的别名一样。

可以通过内置的猴子补丁为加载了
require
的CommonJS模块的某些路径指定别名
模块
模块

ES模块提供了一种通过指定来更改模块加载行为的方法,如中所述

这样,根源路径(将相对加载程序位置指定)可以映射到某些别名(对于前端项目):

定制加载程序.mjs

它的用法如下:

node --experimental-modules --loader ./custom-loader.mjs ./app.mjs

请注意,这为ES模块提供了一种非自然的行为,这可能会影响其他工具(如IDE)处理此代码的方式。

更高版本,适用于ES模块

到目前为止,我找到的最简单的方法是使用实验性特性
--loader

我使用类似的东西来要求从“@config”导入{SOME_CONSTANT},或者从“@server/connection”导入{createConnection}

加载程序代码:

import path from 'path'
import fs from 'fs'

export function resolve (specifier, parentModuleURL, defaultResolver) {
  specifier = specifier.replace(/^@/, path.resolve('.') + '/src/')
  specifier = fs.existsSync(specifier) && fs.lstatSync(specifier).isDirectory() ? `${specifier}/index` : specifier
  specifier += '.js'
  return defaultResolver(specifier, parentModuleURL)
}
然后
node——实验模块——loader./moduleResolver.js./myScriptWithoutExtension

注意:如果在最近的
包.json
中指定
类型“:“module”
,则不需要使用
.mjs
扩展名。您可以保持无扩展。
注2:您可以将
src
字符串替换为通常放置代码的位置,甚至可以使用基于
process.env.NODE\u env
的解析。
注3:如果您为
@
提供一个目录,它将期望找到一个
index.js
文件。

注4:你可以使用你想要的任何别名,只要替换regex

每当我想在Node.js应用程序中有相对路径时,我就使用app module path-你是如何使用它的?不清楚你在问什么。ES和CJS模块以类似的方式解析。它们以类似的方式解析,但只要我使用
import
而不是
require
导入应用程序模块路径,终端中就会出现神秘错误。如果您有特定问题,请解释并提供。对模糊问题的回答不一定有助于解决它。我想要一种不必在Node.js项目的任何地方使用
。/
的方法
app-module-path
允许我通过调用根目录中的
require('app-module-path/register')
来完成此操作。这样,我就可以从项目中的任何位置引用根目录中的所有文件夹,例如
require('some-directory/a-file')
,即使该文件位于根目录中。对于导入语法,似乎没有任何解决方案可以做到这一点。Webpack有目录别名,所以我想一定有Node.js的方法。
import path from 'path'
import fs from 'fs'

export function resolve (specifier, parentModuleURL, defaultResolver) {
  specifier = specifier.replace(/^@/, path.resolve('.') + '/src/')
  specifier = fs.existsSync(specifier) && fs.lstatSync(specifier).isDirectory() ? `${specifier}/index` : specifier
  specifier += '.js'
  return defaultResolver(specifier, parentModuleURL)
}