Atom公开了一些您可以从require('atom')
这在功能上如何运作? Atom包没有明确地将atom作为依赖项,但它们仍然可以执行此操作。此外,我如何使用自己的全局包在我自己的Electron应用程序中执行此操作?
答案 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)
它尝试在默认为正常行为之前解析具有自己的模块缓存逻辑的模块的路径。这样做有几个原因,我可以告诉你。
'atom'
,即使正常行为永远不会找到它。