【问题标题】:How to have path alias in nodejs?如何在nodejs中拥有路径别名?
【发布时间】:2016-01-17 19:43:06
【问题描述】:

假设我有以下代码:

var mod1 = require('../../../../ok/mod1');
var mod2 = require('../../../info/mod2');

上面的代码不是很漂亮,我想知道是否有一种方法可以像 nodejs 中的webpack-resolve-root 那样配置根解析器?

据我所知,NODE_PATH 可以用来替换node_modules 的根,但这不是我想要的。我想让解析器按顺序解析多个文件夹。

【问题讨论】:

    标签: node.js root resolve


    【解决方案1】:

    2021 年的更新答案。

    nodejs subpath imports 已添加到:v14.6.0、v12.19.0

    这允许您将以下内容添加到 package.json

    "imports": {
      "#ok/*": "./some-path/ok/*"
      "#info/*": "./some-other-path/info/*"
    },
    

    在你的 .js 中

    import mod1 from '#ok/mod1';
    import mod2 from '#info/mod2';
    

    【讨论】:

    • 这个可以和 const mod = require('') 一起工作吗?
    • 哦,这是个好问题。特别是因为这是OP所问的。我不知道,但我对此表示怀疑。
    • 它实际上也适用于 const mod = require('')。
    • 有没有办法让位于节点根目录之外的外部文件夹工作?例如:服务器和共享文件夹,服务器是一个包,其中定义了子路径导入到共享文件夹。希望这能奏效:"#shared/*": "../shared/src/*"
    • 这适用于打字稿,但您确实需要使用“#”而不是“@”。 tsconfig.json:"paths": { "#pkg2/*": ["./pkg2/*"] },package.json:"imports": { "#pkg2/*": "./pkg2/*" }
    【解决方案2】:

    有一个名为 module-alias 的 npm 包可以满足您的需求。

    【讨论】:

    • 这个包可以保留路径智能感知吗? (stackoverflow.com/questions/53693686)
    • 当心包有一些问题。它会擦除您的整个存储库。显然它发生在少数用户身上。数据丢失没有解决方案。确保在使用此模块之前提交所有更改
    • package.json "imports" 是要走的路。查看更新的答案。
    【解决方案3】:

    解决此问题的最佳方法是使用全局(配置)容器。 在大多数情况下,您的应用程序中会有一个配置文件。在此配置中,您可以添加一个属性,该属性将是一个包含文件/文件夹的所有绝对路径的对象。 因为配置文件是在你的应用程序开始时使用的,所以你只需执行以下操作:

    var config = require("./config.js");
    //config = {... , path: {"someModule": "/absolute/path/to", "someModule2": "/absolute/path/to"...}}
    global.CONFIG_CONTAINER = config
    

    稍后在您的应用程序中,您可以使用

    var myModule = require(CONFIG_CONTAINER.path.someModule)
    // + concat if you are looking for a file
    

    如果您有一些复杂的路径并且您需要一个更动态的系统,您可以随时在配置中实现一个函数,该函数将为您构建路径。 ( config.makePath = function(){...} ) 简而言之,这应该可以解决问题。

    【讨论】:

    • 我不能用这种方式。我是前端开发人员,我使用webpack 作为开发工具来编译用commonjs 编写的源代码。一旦我想编写单元测试,我发现模块无法正确加载,因为我在require 中使用的路径由webpack-resolve-root 解析
    猜你喜欢
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2016-04-23
    • 2012-06-13
    • 2021-05-27
    相关资源
    最近更新 更多