Node.js 在运行时确定节点模块的位置

Node.js 在运行时确定节点模块的位置,node.js,npm,node-modules,Node.js,Npm,Node Modules,我正在构建一个基本上是node.js模块的工具。这个工具可以全局安装(使用-g选项)。我在模块中只有很少的静态文件来生成报告。如果在本地调用该模块,我可以使用相对路径/node\u modules//static/filename引用静态文件。但是,当该工具作为命令调用时,如何引用静态文件?如何确定该工具是作为本地模块调用还是作为命令调用?使用神奇变量\uu dirname。它指的是包含脚本文件的目录 使用神奇变量\uuu dirname。它指的是包含脚本文件的目录 在全局安装工具时,Unix系

我正在构建一个基本上是node.js模块的工具。这个工具可以全局安装(使用
-g
选项)。我在模块中只有很少的静态文件来生成报告。如果在本地调用该模块,我可以使用相对路径
/node\u modules//static/filename
引用静态文件。但是,当该工具作为命令调用时,如何引用静态文件?如何确定该工具是作为本地模块调用还是作为命令调用?

使用神奇变量\uu dirname。它指的是包含脚本文件的目录


使用神奇变量\uuu dirname。它指的是包含脚本文件的目录


在全局安装工具时,Unix系统上通常有两个条目:

  • /usr/local/lib/node\u modules/
    ->包含所有模块源文件的目录
  • /usr/local/bin/
    ->符号链接到模块可执行脚本
由于节点使用实际路径(即在解析所有符号链接之后)来解析相对于当前模块的路径,因此您不必担心全局安装和本地安装之间的差异

您需要处理的是节点进程正在运行的可能不同的当前工作目录。解决方案是根据模块所在的绝对路径解析静态文件的相对路径,而不是像示例中那样假设节点进程将在特定目录中运行

有两种方法:

  • 使用包含当前源文件的目录名(路径)的
    \uu dirname
    ():

    var path = require('path');
    // assuming this script is in package root directory
    var staticFile = path.resolve(__dirname, 'static', 'filename');
    // if the script is in lib/ subdirectory, then you want to call
    var staticFile = path.resolve(__dirname, '..', 'static', 'filename');
    
  • 使用
    require.resolve()
    ,它返回与调用
    require()
    使用的文件名完全相同的文件名:


  • 在全局安装工具时,Unix系统上通常有两个条目:

    • /usr/local/lib/node\u modules/
      ->包含所有模块源文件的目录
    • /usr/local/bin/
      ->符号链接到模块可执行脚本
    由于节点使用实际路径(即在解析所有符号链接之后)来解析相对于当前模块的路径,因此您不必担心全局安装和本地安装之间的差异

    您需要处理的是节点进程正在运行的可能不同的当前工作目录。解决方案是根据模块所在的绝对路径解析静态文件的相对路径,而不是像示例中那样假设节点进程将在特定目录中运行

    有两种方法:

  • 使用包含当前源文件的目录名(路径)的
    \uu dirname
    ():

    var path = require('path');
    // assuming this script is in package root directory
    var staticFile = path.resolve(__dirname, 'static', 'filename');
    // if the script is in lib/ subdirectory, then you want to call
    var staticFile = path.resolve(__dirname, '..', 'static', 'filename');
    
  • 使用
    require.resolve()
    ,它返回与调用
    require()
    使用的文件名完全相同的文件名: