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