【问题标题】:How does require('atom') work?require('atom') 是如何工作的?
【发布时间】:2016-06-18 01:48:39
【问题描述】:

Atom 公开了一些全局 API,您可以从 require('atom') 访问它们

这在功能上是如何工作的? Atom 包没有明确地将 atom 作为依赖项,但它们仍然可以这样做。此外,我如何在自己的 Electron 应用程序中使用自己的全局包做到这一点?

【问题讨论】:

  • 在什么情况下,您的package.json 文件中需要哪些软件包?
  • node_modules 可以是found in any parent directory
  • 如前所述,这是在文本编辑器 Atom 的包中。
  • @jonathan 是的,但是如果 atom 确实像这样正常提供它,那么它使用的可以在其他 Electron 应用程序中复制的目录结构是什么?

标签: javascript node.js electron atom-editor


【解决方案1】:

我自己浏览并分析了 Atom 的来源以确定这是如何发生的,这就是我想出的。

需要使用 normal node require 的 Atom 包。不过根据apm自述文件:

另一个主要区别是 Atom 包安装到 ~/.atom/packages 而不是本地 node_modules 文件夹...

所以require('atom') 包不像普通节点模块那样从父node_modules 目录中检索。相反,Atom 会覆盖模块加载器以稍微改变行为。

更具体地说,它们会像这样覆盖Module._resolveFilename

Module = require 'module'

Module._resolveFilename = (relativePath, parentModule) ->
  resolvedPath = resolveModulePath(relativePath, parentModule)
  resolvedPath ?= resolveFilePath(relativePath, parentModule)
  resolvedPath ? originalResolveFilename(relativePath, parentModule)

在默认为正常行为之前,它会尝试使用自己的模块缓存逻辑解析模块的路径。这样做有几个原因,我可以说。

  1. 它可以让他们硬编码像 'atom' 这样的内置模块的路径,即使正常行为永远不会找到它。
  2. 当包具有与兼容版本相同的依赖项时,它可以防止加载包依赖项两次。如果 packageA 加载了 lodash@4.x.x,之后 packageB 尝试加载 lodash@>=3,那么 Atom 会介入并为 packageB 提供 packageA 加载的 lodash。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 2012-09-19
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    相关资源
    最近更新 更多