【问题标题】:javascript: Refactor global objects to require() modulesjavascript:将全局对象重构为 require() 模块
【发布时间】:2017-07-10 18:05:10
【问题描述】:

我想现代化我们的 JavaScript 架构——更重要的是,开始为我们的 JavaScript 代码编写单元测试。

我一直在将来自不同问题/博客的信息拼凑在一起,并制定了一个暂定计划。但是,我真的不确定我是否走在正确的轨道上。

计划:

  1. 将组件重构为导出模块而不是全局对象。
  2. 创建一个需要()所有文件/组件的单一入口点 (index.js?)。
  3. 使用 Browserify 创建与浏览器兼容的静态文件(返回全局)。
  4. 使用 node、mocha 和 chai,运行 npm test 来执行引用可导出组件的测试。

重构:

全局对象:

// myProject.js
// --------------------
var MyProject = {};

// component1.js
// --------------------
myProject.component1 = {};

到 require() 模块:

// myProject.js
// --------------------
var component1 = require('./component1');
modules.export = { component1 };

// component1.js
// --------------------
var component1 = {};
modules.exports = component1;

问题:

如果一个项目使用全局对象来命名组件,我如何重构这些 JavaScript 文件以导出将在节点中工作的模块?上述计划是否遵循 JavaScript 依赖项/模块的现代标准?

我主要担心的是我的 index.js(或主条目)文件将成为维护的噩梦(将每个新文件添加为 require())。

【问题讨论】:

  • 您的index.js 应该只需要核心入口点(如顶级组件)。将间接需要其他文件。
  • 这很有意义,感谢您指出这一点。作为使用 require() 的新手,我什至没有意识到我可以依靠组件来煮沸所有东西。谢谢x1000

标签: javascript node.js dependency-injection browserify


【解决方案1】:

您的 index.js 应该只需要核心入口点(如顶级组件)。

将间接需要其他文件。

因此,您不应该有任何所有文件的巨大列表;每个文件应该只需要它直接使用的东西。

Browserify 将组装所有 require()d 文件的传递闭包。

【讨论】:

  • 感谢您发布这个答案 - 它肯定解决了我对这种方法的主要担忧。在您看来,我是否也可以认为这意味着我的计划的其余部分在其他项目上是可靠的?我愿意接受任何建议/批评——越早越好:)
  • myProject.js 不应导出任何内容。
  • 如果我理解正确的话,myProject.js 可以有效地替换为 index.js,因为它之前的目的只是将所有其他对象分组到一个命名空间下。是吗?
  • @veratti:正确。使用模块时,根本没有命名空间的概念。
  • 感谢您的确认。我的理解有了很大的提高:) 我尽量不要对你回答我的问题感到头晕 - 我在 Twitter 上关注了你一段时间并且是粉丝!在您的帮助下,您过得愉快!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 2014-10-14
  • 1970-01-01
相关资源
最近更新 更多