当前位置: 首页 > 知识库问答 >
问题:

如何让node.js要求绝对?(而不是相对的)

公冶龙野
2023-03-14

我想要求我的文件总是由我的项目根,而不是相对于当前模块。

例如,如果你看第6行https://github.com/visionmedia/express/blob/2820f2227de0229c5d7f28009aa432f9f3a7b5f9/examples/downloads/app.js你会看到

express = require('../../')

在我看来,这真的很糟糕。想象一下,我想把我所有的例子都放在离根更近的一个层次上。这是不可能的,因为我必须更新30多个示例,并且在每个示例中更新很多次。为此:

express = require('../')

我的解决方案是对基于根的文件夹有一个特例:如果字符串以$开头,那么它是相对于项目的根文件夹的。

谢谢你的帮助

现在我正在使用require。js,它允许您以一种方式编写,并且可以在客户端和服务器上工作。要求js还允许您创建自定义路径。

现在我转到webpack gulp,我使用增强的require来处理服务器端的模块。请参见以下理由:http://hackhat.com/p/110/module-loader-webpack-vs-requirejs-vs-browserify/

共有3个答案

闻人河
2023-03-14

我喜欢为共享代码创建一个新的node\u modules文件夹,然后让node和require做它最擅长的事情。

例如:

- node_modules // => these are loaded from your package.json
- app
  - node_modules // => add node-style modules
    - helper.js
  - models
    - user
    - car
- package.json
- .gitignore

例如,如果你在car/index.js中,你可以需要('helper'),节点会找到它!

节点有一个聪明的算法来解决模块,这在竞争对手的平台中是独一无二的。

如果您需要('./foo.js')来自/beep/boop/bar。js,节点将查找/福。js/beep/boop/foo中。js。以开头的路径/ / 始终位于调用require()的文件的本地。

但是,如果您需要非相对名称,如/beep/boop/foo中的require('xyz')。js,节点按顺序搜索这些路径,在第一次匹配时停止,如果未找到任何内容,则引发错误:

/beep/boop/node_modules/xyz
/beep/node_modules/xyz
/node_modules/xyz

对于存在的每个xyz目录,节点将首先查找xyz/包。json查看是否存在“main”字段。“main”字段定义了如果您需要()目录路径,应该由哪个文件负责。

例如,如果/beep/node_modules/xyz是第一个匹配项,并且/beep/node_modules/xyz/package。json具有:

{
  "name": "xyz",
  "version": "1.2.3",
  "main": "lib/abc.js"
}

然后/beep/node_modules/xyz/lib/abc.js的导出将由要求('xyz')返回。

如果没有package.json或没有"main"字段,则假定index.js

/beep/node_modules/xyz/index.js

盖嘉珍
2023-03-14

Browserify手册中有一个非常有趣的部分:

并非应用程序中的所有内容都属于公共npm,在许多情况下,设置私有npm或git repo的开销仍然相当大。下面是一些避免的方法。/.../.../.../.../...相对路径问题。

人们有时反对将特定于应用程序的模块放入node_模块,因为不清楚如何在不同时从npm检入第三方模块的情况下检入内部模块。

答案很简单!如果您有gitignore忽略节点模块的文件

node_modules

您可以使用添加一个异常 对于每个内部应用程序模块:

node_modules/*
!node_modules/foo
!node_modules/bar

请注意,如果父目录已被忽略,则无法取消子目录。因此,您必须使用node\u modules/*技巧忽略node\u modules中的每个目录,而不是忽略node\u modules,然后您可以添加异常。

现在,在您的应用程序中的任何地方,您都可以在没有非常大且脆弱的相对路径的情况下要求('foo')要求('bar')

如果您有很多模块,并且希望使它们与npm安装的第三方模块更加分离,您可以将它们全部放在node\u modules的目录下,例如node\u modules/app

node_modules/app/foo
node_modules/app/bar

现在,您可以从应用程序中的任何位置要求('app/foo')要求('app/bar')

在您的. gitignore中,只需为node_modules/app添加一个异常:

node_modules/*
!node_modules/app

如果您的应用程序在包中配置了转换。json,您需要创建一个单独的包。json在您的node\u modules/foonode\u modules/app/foo组件目录中具有自己的转换字段,因为转换不会跨模块边界应用。这将使您的模块对应用程序中的配置更改更加健壮,并且更容易在应用程序之外独立重用包。

如果你在一个应用程序上工作,你可以制作符号链接,而不需要支持窗口,另一个方便的技巧是将一个lib/app/文件夹符号链接到node_modules。从项目根,做:

ln -s ../lib node_modules/app

现在,通过执行require('app/foo.js')以获取lib/foo,您可以从项目中的任何位置获取lib/中的文件。js

您可能会看到一些地方谈论使用$NODE\u PATH环境变量或选项。路径为节点添加目录,浏览查找模块。

与大多数其他平台不同,与有效使用节点模块目录相比,在节点中使用带有$NODE\u path的shell样式的路径目录数组并不那么有利。

这是因为您的应用程序与运行时环境配置的耦合更紧密,因此有更多的活动部件,只有在正确设置环境时,您的应用程序才能工作。

节点和浏览器都支持,但不鼓励使用$NODE_PATH

曹景铄
2023-03-14

那么关于:

javascript prettyprint-override">var myModule = require.main.require('./path/to/module');

它需要这个文件,就好像它是主js文件中需要的一样,所以只要主js文件位于项目的根目录下,它就可以正常工作。。。这是我很感激的。

 类似资料:
  • 问题内容: 我想始终通过项目的根目录而不是相对于当前模块来要求文件。 例如,如果您查看https://github.com/visionmedia/express/blob/2820f2227de0229c5d7f28009aa432f9f3a7b5f9/examples/downloads/app.js第6行,您将看到 这真是糟糕的IMO。想象一下,我只想将我所有的例子都更接近一个根。那将是不可

  • 问题内容: 我有两个网址: 如何获得url2的绝对URL? 问题答案: 您应该使用urlparse.urljoin: 使用Python 3(将urlparse重命名为urllib.parse),您可以按以下方式使用它:

  • 问题内容: 和CSS 和有什么不一样?那你什么时候应该使用呢? 问题答案: CSS绝对定位 绝对定位是最容易理解的。您从CSS 属性开始: 这告诉浏览器应将要定位的所有内容从文档的正常流程中删除,并将其放置在页面上的确切位置。它不会影响HTML中它之前或之后的元素在网页上的放置方式,但是除非您重写它,否则 它将 取决于其父级的位置。 如果你想一个元素从文档窗口的顶部10个像素的位置,你会使用偏移与

  • 问题内容: 我想使用abs()对元组进行排序,而无需实际将元组的元素更改为正值。 根据python Wiki(https://wiki.python.org/moin/HowTo/Sorting/#Key_Functions),sorted(list,key =)函数假定使用参数 key 进行排序,而实际上并未更改清单。但是,abs()只需要int(),如果我需要这样做,我还没有想办法将元组变成i

  • 问题内容: 使用进行调试时,如何获取完整的对象? 输出: 但我也想看看财产的内容。 问题答案: 您需要使用: 产出 参见docs。

  • 我有以下情况: 我有两个JVM进程(实际上是两个单独运行的java进程,而不是两个线程)在本地机器上运行。让我们把它们称为进程A和进程B。 我希望他们彼此通信(交换数据)(例如,ProcessA向ProcessB发送消息以执行某些操作)。 现在,我通过编写一个临时文件来解决这个问题,这些过程会定期扫描该文件以获取消息。我认为这个解决方案不太好。 什么是实现我想要的更好的选择?