领先一步
VMware 提供培训和认证,助您加速进步。
了解更多VMWare 的 JavaScript 编辑器 Scripted 已于上月在此博客上发布。在本文中,我们将深入了解 Scripted 的 依赖分析引擎。但在深入探讨细节之前,我们先来阐述一下为什么我们需要它。
[caption id="attachment_12178" align="aligncenter" width="533" caption="跨文件内容辅助"]
[/caption]
两个组件协同工作以实现此目标
如果您只是想将所有代码放入一个大文件中,那么一个高质量的推断器就足以提供相当不错的内容辅助。实际上,项目将被划分为模块。在上面的示例中,'main' 模块导入了一个 'utils' 模块。当您编辑 main 模块时,Scripted 会适当地从 'utils' 建议函数。依赖分析引擎使这成为可能。
[caption id="attachment_12180" align="aligncenter" width="518" caption="未解决模块的错误标记"]
[/caption]
Scripted 还使用依赖分析来支持轻松导航。在已解决的依赖项名称上按 Shift 键或 Ctrl 键并单击将带您到相应的文件。
将来,依赖分析还可能允许我们实现重构工具。例如,如果您将 .js 文件拖放到不同的目录,Scripted 可以根据需要自动更新相对路径引用。
getDGraph :: <path-to-js-file> -> <dependency-graph>此函数计算依赖图的 JSON 表示。此图包含目标文件直接或间接依赖的所有文件的节点。如果我们将 'main' 模块传递给它,它将返回如下内容
getDGraph('/sample/main.js') ==>
{
...
"/NODE-NATIVES/stream.js": {
"kind": "commonjs",
"refs": { ... }
},
"/NODE-NATIVES/fs.js": {
"kind": "commonjs",
"refs": {
"stream": {
"kind": "commonjs",
"name": "stream",
"path": "/NODE-NATIVES/stream.js"
},
...
}
},
"/sample/utils.js": {
"kind": "commonjs",
"refs": {}
},
"/sample/main.js": {
"kind": "commonjs",
"refs": {
"fs": {
"kind": "commonjs",
"name": "fs",
"path": "/NODE-NATIVES/fs.js"
},
"./utils": {
"kind": "commonjs",
"name": "./utils",
"path": "/sample/utils.js"
}
}
}
}此 JSON 对象中的每个属性都代表图中的一个节点。'refs' 属性包含边。每条边对应一个模块导入。一个有趣的细节是,依赖分析器为原生 Node 模块返回特殊的 path 字符串。当推断引擎请求此类路径的源代码时,Scripted 服务器(用 JavaScript 编写并运行在 Node.js 上)从其自己的 Node.js 进程中提取源代码。推断引擎像分析普通 JavaScript 文件一样分析它。结果是为内置 Node 模块提供了不错的内容辅助
[caption id="attachment_12184" align="aligncenter" width="587" caption="内置 Node 模块的推断建议"]
[/caption]
步骤 2 和 3 根据步骤 1 中的模块类型分派给不同的支持模块。添加对其他模块类型的支持应该相对容易(前提是步骤 1 检测器可以识别新的模块类型)。
对于 Node/CommonJS,这工作得很好,主要是因为实际上没有什么需要配置的。也就是说,如果我们假设使用标准的 Node.js 加载器算法,那就是我们所需的所有信息。
对于 AMD,情况不幸更复杂。典型的 AMD 加载器(例如 requirejs)是高度可配置的。此外,这种配置在项目源代码中表达的方式往往因项目而异。这使得在一个随机项目中确定在哪里找到所需信息成为一个挑战。
我们采取的方法是查看一些示例项目以及它们使用的“典型”模式。发现通过识别这些模式来工作。希望如果我们支持足够多的常见模式,最终发现将适用于大多数项目。对于那些失败的情况,我们可能还会添加一些手动配置选项作为最后手段。
为了说明 AMD 发现是如何工作的,这里有一个我们目前检测到的模式示例
这里的模式是一个带有 data-main 属性的 script 标签……如果 Scripted 发现这一点,它将会在 data-main 文件中查找 requirejs 风格的配置块
AMD 配置发现正在进行中。随着我们获得更多关于人们如何设置 AMD 加载器的示例,我们尝试为它们添加检测器。如果 Scripted 错误地将许多依赖项标记为错误,则它可能未能发现您的 AMD 配置。您可以通过提出错误请求来帮助我们。如果您附上说明您的“典型模式”的代码示例。这将有助于我们扩展我们的“模式目录”。
想尝试 Scripted 吗?从 GitHub 获取它。它易于安装。下载和安装说明在 readme 文件中。