JS:RequireJS策略:需要一次或每次需要吗?

时间:2016-02-25 15:38:29

标签: javascript requirejs

在编写现代JS(ECMA6,NodeJS,React Native)时,我有些困惑

我有一个核心文件,需要我需要的大部分内容,比如app.js

var dependency1 = require('dependency1');
var dependency2 = require('dependency2');

subfile1.js中,我也需要访问dependency1。我认为有两种方法可以做到这一点:

解决方案1:需要一次并转发给其他人

我应该写app.js

var subfile1 = require('./subfile1')(dependency1);

subfile1.js

module.exports = function(dependency1) {
  var subfile1;
  // do many things;
  return subfile1;
} 

解决方案2:每次都要求

app.js

var subfile1 = require('./subfile1');

subfile1.js

var dependency1 = require('dependency1');
module.exports = subfile1;

比较

我的直觉是使用解决方案#1 更简洁,因为它只构建每个依赖项的一个实例。

但另一方面,编写起来会更加痛苦,特别是当依赖开始变得众多时。

此外,黑盒效果失败,在编写独立模块时通常会感激。

我的理解是,如果模块完全无状态(即不调用var dependency1 = new Dependency1()),两种解决方案都不应有所作为。

这给我带来了几个问题:

  • 我们如何确定实际情况呢?
  • 当我在编写模块时,我应该记住这一点吗?
  • 使用外部模块时,作者不应该确定它是否是无状态的吗?
  • 那里有最好的练习吗? (编写功能代码?)
  • 使用ES6中的classes会不会有这种风险?
  • 记忆是否有任何影响?
  • 我说的是不是错了?

1 个答案:

答案 0 :(得分:0)

Node.js的require内部行为解决了您的问题,因为模块是cached。它们将被创建一次,之后您将检索实例。您没有因第二种方法的状态而导致的额外问题,但是相同的行为(即使用有状态模块时,很有必要)。

此外,当您想要使用它时,您不必担心模块依赖性(特别是,当将依赖项添加到子模块时,您不必修改主代码,特别是当它不是您的子模块时)。

因此,#2是一种更好的方法。

app.js

var subfile1 = require('./subfile1');

subfile1.js

var dependency1 = require('dependency1');
var subfile1;
// many things
module.exports = subfile1;