require('atom')如何工作?

Atom公开了一些可以从require('atom')访问的全局API

这个function如何工作? Atom包没有明确地将primefaces作为依赖,但他们仍然可以做到这一点。 而且,我怎样才能用我自己的全球软件包在我自己的Electron应用程序中做到这一点?

我经历了一番,分析了Atom的来源,以确定这是怎么发生的,而这正是我所想到的。

Atom包需要使用正常的节点需求 。 但是,根据apm自述:

另一个主要的区别是,Atom包安装到〜/ .atom /包而不是本地的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) 

它试图在默认正常行为之前使用自己的模块caching逻辑来parsing模块的path。 这是由于几个原因,我可以告诉。

  1. 它可以让他们像'atom'一样对内置模块的path进行硬编码,即使正常行为永远不会发现它。
  2. 当包与兼容版本具有相同的依赖性时,它可以防止两次加载包依赖关系。 如果packageA加载lodash@4.xx,然后packageB尝试加载lodash @> = 3,则Atom步入并且给packageB加载packageA的lodash。