8

我真的对 JS 社区中使用 Node.js 和 NPM 以及他们的 JS 库的每个人感到困惑。为什么我们必须采取如此极端的措施?这为我们解决了哪些问题?

[编辑] 我认为我的问题不是重点。

  1. Ember.js、Batman.js 和最近的 Yahoo 的 Mojito 等框架要求我使用 node.js——为什么要依赖 Node.js 和 NPM?
  2. 为什么我们要让事情变得复杂?“如果你还没有,你需要安装 node.js...” 你读到这样的消息然后你就被关闭了。

为什么?JS 中已经存在一个问题 - 有太多活动的 JS 库/框架可供选择 - 根据 JS 库的记录,大多数将很快变得不活动。有太多东西要寻找,这通常会导致应用程序中出现多个框架 - 依赖管理、路由器、MVC、模板等。除此之外,我们正在使用 Node.js 来使用这些库/框架......如何这会将这些库的使用推给新的 JS 开发人员吗?JS 本来就是为了简单!

4

4 回答 4

11

“如果你还没有,你需要安装 node.js...” 你读到这样的消息然后你就被关闭了。为什么?

NodeJS 是 Google 的 V8“独立运行”。它是一个带有附加低级 API(网络、I/O 等)的 JS 引擎。NodeJS 为仅限于在浏览器上工作的 JS 开发人员提供了“缺失的平台”。

为什么要依赖 Node.js 和 NPM?

Node.js 除了将其用作应用程序(服务器、代理、机器人等)外,它还可以用作构建工具和辅助开发。以 Grunt 为例,它是一个类似于 Make 的可编写脚本的自动化工具。只用普通的 JS 编写脚本,你不需要学习另一种工具或语言来进行自动化。另一个工具是 Bower,它是一个前端包管理工具。您需要做的就是一个bower install jquery,它使用该单个命令安装 jquery。无需手动下载、复制和粘贴。

另一方面,NPM 是 Node.js 的包管理器。它是一个管理您在 NodeJS 上使用的模块的程序。无需手动列出您的模块,也无需在其他地方开发时记住它们。只要你有 NPM 为你制作的包列表,重新安装只是npm install.

为什么我们要让事情变得复杂?

不是。事实上,我们正在为开发人员简化它们。无需担心工作流程、管理库或手动操作,您可以将这些任务卸载到 NPM 上的某些模块上。然后你就可以专注于你实际在做的事情。

最重要的是,我们使用 Node.js 来使用这些库/框架......这将如何将这些库的使用推给新的 JS 开发人员?JS 本来就是为了简单!

如上所述,NodeJS 是一个多功能平台。它可以用作服务器(Connect、Express)、自动化工具(Grunt)、包管理系统(使用 NPM、Bower 等)、测试平台(QUnit、Mocha)、代理、游戏服务器、聊天机器人.

而且它是有益的,尤其是对 JS 开发人员,因为这些在 JS 中是不可能的。

JS 中已经存在一个问题 - 有太多活动的 JS 库/框架可供选择 - 根据 JS 库的记录,大多数将很快变得不活动。有太多东西需要寻找,这通常会导致应用程序中出现多个框架——依赖管理、路由器、MVC、模板等。

好吧,拥有丰富的框架集是件好事。在学习了其中一些之后,您的工作将减少一半。实现的多样性也很好,可以解决不同的编码风格和不同的实现方法。一些库源于不同的方法,而另一些则源于其他库的不兼容和/或不完整。

开发人员正在努力通过规范化 JS 怪癖来让其他开发人员的生活更轻松(因为浏览器供应商似乎无法做正确的事情来遵循标准)并且大多数都是自愿完成的,就像免费啤酒一样 - 你应该为此感到高兴。此外,没有人会强迫你使用一个。

于 2012-05-14T14:23:28.667 回答
5

CommonJS 标准(在我看来,最好由 Node.js 和 NPM 实现)将模块的概念引入Javascript。多年来,Perl 和 Python 社区已经证明了为什么模块很棒:

  • Unix 风格的“做一件事并做好”库,这些库很小并且针对错误进行了大量测试,可以轻松组合(没有命名空间问题)以解决您的特定任务。
  • 开源模块(CPAN、NPM 等)的中央存储库,您可以轻松从中提取模块(NPM 通过保持所有版本可用将其提升了一级,因此您可以指定您的代码使用最后一个已知的“好”版本,而不是希望重新部署 la CPAN 时没有任何问题)。
  • 对代码进行更多的同行评审(因为它们更容易组合,它们用于更多不同的情况,所以这有助于减少错误,也有助于改进模块以使其更通用)。
  • 解决了更多种类的任务。由于库很短,几乎任何人都可以编写一个。这确实意味着有更多的垃圾需要过滤(有关广泛使用的库的文章对此有所帮助),但这也意味着可能还存在一个解决一些非常具体的问题(例如本地化字符串和日期)的库。

然后一个名为browserify的 Node 模块使您的客户端代码的实际构建过程变得异常简单,您几乎可以使用在 NPM 上找到的任何代码。

这打破了像 jQuery 这样的库的“厨房水槽”心态(他们开发了自己的自定义构建系统,因此他们也可以开始模块化他们的代码)认为他们需要解决用户可能遇到的每一个问题,而不仅仅是生成其他库可以使用的结果。

于 2012-05-14T16:27:19.353 回答
1

很多时候,您需要不同版本的 javascript。通常它分布在不同的文件中,有时它在咖啡脚本中。您经常需要一个构建 AMD 兼容构建,以及 CommonJS 一个,以及常规的最小化和非最小化构建。

还有可能解决依赖关系。

我什至见过一个为 jQuery 和原型构建的库......

于 2012-05-14T14:24:45.780 回答
1

编辑:注意到我正在按照问题正文中的措辞回答问题,但错过了标题中的编译问题。

您认为这是“极端措施”的标准是什么?这已经做了很多年了,为了编写干净、易于读/写的代码,但预编译为在线传输进行优化(也许还有其他优化)。Node.js 对此提供了一个很好的解决方案,仅仅是因为它也使用 JavaScript,因此使用它来编译 JavaScript 代码的人们很熟悉。以前,这通常是用 Python 之类的东西完成的,虽然它可以工作,但对我来说似乎比坚持使用通用语言更不明智。

于 2012-05-14T14:24:54.600 回答