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