一个节点模块和一个普通的JavaScript文件之间有什么区别?

4
最近我写了一个非常基础的Node.js应用程序,但是我对Node.js模块和JavaScript模块之间的区别有点困惑。例如,我可以在Node.js和JavaScript中都像下面这样利用underscore库: Node.js
var _ = require("underscore");
_.each([1, 2, 3], console.log);

JavaScript

<script src="path/to/underscore.js"></script>
_.each([1, 2, 3], console.log);

我得到了完全相同的结果。让我困惑的是,是否真的有必要在浏览器中运行客户端代码,而我们可以在一个Node模块中处理所有内容呢?


你可以在服务器上完成所有编码(它不是特定于Node的),但如果你想进行页面操作而不刷新页面或使用AJAX,那么没有客户端技术,你该如何实现呢? - Vsevolod Goloviznin
我百分之百确定在这两种情况下结果是不一样的。如果你在服务器上运行alert(),它肯定不会在客户端的浏览器中弹出对话框。 - JJJ
好的,“alert”不重要。我的意思是相同的功能。 - sadrzadehsina
@VsevolodGoloviznin,关于Ajax的问题是正确的。但是我不确定一些库(例如underscore)作为JavaScript文件和节点模块存在的目的。 - sadrzadehsina
2
“同样的功能”是什么意思?如果您需要在服务器上完成某些操作,则应在服务器上执行。如果您需要在浏览器上完成某些操作,则应在浏览器上执行。如果有一些操作可以在两者上都完成,那么您可以选择使用哪个。 - JJJ
@Sina,目的是要在 node 或浏览器中使用它们。如果你想在浏览器中为一个元素数组运行该函数,应该怎么做? - Vsevolod Goloviznin
1个回答

1

Juhanna已经在评论中说过了

如果在服务器上运行alert(),它肯定不会弹出客户端浏览器中的警报对话框。

但是,如果您谈论功能差异(并且真的不关心在客户端上运行服务器代码:那是愚蠢的),

1:在客户端上

<script src="path/to/xyz.js"></script>

脚本包含在页面中,无论在脚本内部编写什么内容,您都没有选择只导入 xyz.js 文件的一部分。

例如: xyz.js:
var a;
var b;
function Alwaysincluded(){

}
function ThisOnealsoAlwaysincluded(){

}

无论在script.js中有什么内容,所有的东西都包含在html文件中。

2:在节点服务器上

var _ = require("xyz");

您可以编写整个应用程序,但只返回一个小对象,例如,如果您的文件包含:

export.js文件:

var xyz=10;
function neverExported(){
// do some stuff
}
 module.exports = function(width) {
      return {
        area: function() {
          return width * width;
        }
      };
    }

这里发生了什么: 整个文件没有被导出到节点服务器,而是被执行,然后显式导出的对象被传递。所以在这个例子中,function neverExported()从未被导出到server.js。
区别1:这就是节点模块和普通javascript文件之间的一个区别。
另一个区别:
区别2: 1: <script src="path/to/xyz.js"></script>脚本在加载之前是否被执行:NO 2: 模块var _ = require("xyz"); 是否被执行,然后返回一个对象:YES
因此,在这里有两个不同之处。

谢谢,但我不确定第一个差异。因为您可以拥有一个使用揭示模式编写的JavaScript模块,并且只返回特定模块的某些功能。 - sadrzadehsina
@Sina 是的,这是真的。但在这两种情况下存在差异:在客户端上,所有内容都被包含了进来,你可以选择不透露,但仍然已经包含了进来,而在节点上,则是所有内容都没有被包含进来,你可以选择透露所有内容。我希望你能理解。 - Naeem Shaikh
如果你真的想要在客户端脚本中使用但不导出变量,你可以这样做:(function() { var x; /* x将不会被导出 */ /* 做一些事情 */ })();。在这里,你定义了一个包含局部变量x的函数,然后运行它。局部变量将无法在函数定义之外的任何地方访问。如果你想要,x甚至可以是一个函数本身。 - David Knipe
@DavidKnipe 在客户端上,所有内容都被包含在内,你不能透露... 你读到了吗? - Naeem Shaikh
通常人们说“你可能不允许...”时,意思是“你不被允许...”。这不是你在这里的意思。此外,“你的选择但仍包括”似乎是在说你可以选择包括或不包括它,但你必须包括它,这是矛盾的。 - David Knipe
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接