require('atom')如何工作?

时间:2016-06-18 01:48:40

标签: javascript node.js electron atom-editor

Atom公开了一些您可以从require('atom')

访问的全局API

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

1 个答案:

答案 0 :(得分:2)

我已经完成并自己分析了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。