`
larlf
  • 浏览: 107707 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

混乱的Node.js

阅读更多

因为打算试用一下最新的VS Code,我用npm命令安装了weak库,不过在编译的过程中出错了,看了下错误提示,不是常见依赖问题,而是一些这样的错误提示:

error C3861: '__builtin_huge_valf' : identifier not found
error C3861: '__builtin_nanf' : identifier not found
……



看上去是有一些定义没有找到,原因不详。搜索后发现问题的原因是出在我的编译器上,在Visual Sudio 2015 Update 1 里,有些函数已经被修改了宏定义,需要用以下的规则进行一下转换:

__builtin_huge_val()=HUGE_VAL
__builtin_huge_valf()=HUGE_VALF
__builtin_nan=nan
__builtin_nanf=nanf
__builtin_nans=nan
__builtin_nansf=nanf



为此,我只好把weak给clone了一份到本地来,然后修改了binding.gyp,最后用调用npm用本地安装的方式装上了这个Node.js库。

这只是一次小小的不愉快,不过根据我的经验来看,用npm进行安装时,如果代码完全是JS的库还好,如果需要进行本地编译的话,经常并不是一件省心的事。

为什么会这样?我们来看看问题出在什么地方。这里大概的对比了一下几种语言,IDE部分要能支持大型工程构建的才算,普通的TextEditor忽略。

语言 运行环境 标准提供者 语言实现 编译环境 IDE
Java JRE (Oracle) JCP or Oracle Oracle or OpenJDK
javac -> class,跨平台
Eclipse
NetBean
等等
C# .Net FrameWork (Mirsoft) Microsoft Microsoft or Mono csc -> dll,跨平台 VS (Microsoft)
Rust None Mozilla Mozilla rustc -> rlib,不同平台分别编译
None
Node.js
node (Node.js.org) ECMAScript (ECMA) V8 (Google) C++编译器(VC、GCC),不同平台分别编译 None


可以看到,Node.js的构成体系过于分散。语言的标准是ECMA制定的,核心引擎是Google提供的,编译环境又依赖不同平台的C++编译器,而核心的库函数是Node.js.org提供的。这样的混乱的结构就决定了每一个环境有重大技术更新的时候,对Node.js来说都无疑是一场灾难,对于Node.js开发者来说,始终处在一个充满变数不可预知的环境中。

注:此文写完不久后,就发生了left-pad模块被unpublish导致众多项目无法正常构建的事情。

IDE也是Node.js的硬伤,没有完善的系统工程,很难开发出支持大型项目的IDE,JS的语法特点又决定了代码提示、重构这些IDE必须的功能都很难在项目这一级别实现,也无法在编译期排除语义上的错误,这就导致很多错误只能在运行期才会被发现,对于无法稳定重现的错误也很难定位。

如果没有Eclipse、JBuilder、Visual Studio这样的IDE支持,就不可能会有那么多C++/Java/C#的大型项目出现。在系统化的工程里,要用工具来弥补人的不足,保证代码和项目的可靠性。而你在用Sublime编写Node.js程序的时候,写错了一个属性名,不会有任何的错误提示,代码也能运行起来,只不过得到的并不是你想要的结构(动态语言的通病)。你很难想像10人以上的团队用Node.js来写一个大型的工程——如果有的话,那肯定是一团糟,不要说做一次大型的重构,改一个字段名(特别是多个类都可能有同样字段命名的情况下)有可能都是一件大工程。

总而言之,Node.js虽然借了JavaScript的东风,吸引了无数的工发者,但是从长远来看,它并不是一个良好的技术方向,注定会淹没在技术革新的浪潮中。

顺便聊下,什么样的语言才是好的语言呢?人个认为它需要有以下优秀的气质:

* 不依赖GC
* 语义清晰,不要有过多的语法糖和小众的书写方式
* 便于优化,特别是和LLVM这样的引擎配合,对平台的依赖少,支持JIT
* 完整的工具链,包括:依赖管理、项目管理、IDE、标准格式还有其它。。。

在M$收购了Mono后,C#的发展方向可以期待一下。GoLang,Rust,Nim 还在演化中,当然还有Swift。




 

分享到:
评论

相关推荐

    Node.js-dumper.js是一个更好更漂亮的Node.js应用程序变量检查器

    Node.js作为一个强大的服务器端JavaScript运行环境,为开发者提供了丰富的API和工具,使得构建Web应用变得轻而易举。在开发过程中,为了调试和诊断代码,我们经常需要查看应用程序中的变量状态。`dumper.js`就是这样...

    Node.js-QingdaoUjudge的node版本

    Node.js是基于Chrome V8引擎的JavaScript运行环境,它让开发者可以用JavaScript编写服务器端程序,大大拓宽了JavaScript的应用领域。QingdaoUJudge是一个在线编程竞赛平台,它使用Node.js来构建后端服务,以支持代码...

    Node.js-immutable-Javascript不可变的持久化数据集合

    在JavaScript的世界里,数据的可变性一直是引发状态混乱和并发问题的主要原因。为了解决这些问题,`immutable.js` 库应运而生,它为Node.js开发引入了不可变数据集合的概念,同时也融入了函数式编程的思想。`...

    Node.js-friendly-error在Node.js中友好的显示未捕获的错误

    在Node.js开发过程中,错误处理是一项至关重要的任务。"Node.js-friendly-error在Node.js中友好的显示未捕获的错误"这一主题旨在提供一个优雅的方式来处理和显示未被捕获的异常,以提升开发者体验和应用稳定性。友好...

    Node.js-npm是Node.js的包管理工具

    Node.js 是一种基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者能够在服务器端使用 JavaScript 进行编程。npm(Node Package Manager)则是伴随着 Node.js 的发展而诞生的包管理器,它是目前世界上最大的...

    Node.js-subsume嵌入其他数据的数据并在需要时轻松地提取它

    标题中的“Node.js-subsume嵌入其他数据的数据并在需要时轻松地提取它”指的是使用Node.js环境中的一个名为“subsume”的工具或方法,来实现数据的嵌入和高效提取。在Node.js开发中,数据处理是核心任务之一,而...

    Node.js-cli-cursor-CLI光标切换

    在IT行业中,Node.js是一个非常流行的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行编程。这个场景下,我们关注的是一个名为“cli-cursor”的模块,它在Node.js的命令行界面(CLI)环境中扮演着...

    Node.js-Java实现的一个JSON的解析和格式化器

    Node.js是一个开放源代码、跨平台的JavaScript运行环境,用于在服务器端执行JavaScript代码。在本项目"Node.js - Java实现的一个JSON的解析和格式化器"中,开发者老王利用Node.js和Java技术,创建了一个工具,能够...

    pretty-error, 查看 node.js 错误,减少了混乱.zip

    pretty-error, 查看 node.js 错误,减少了混乱 错误 使用 LESS 杂波查看 node.js 错误的小工具: 。与未格式化的node 错误相比,更易于阅读: 安装使用npm安装:$ npm install pretty-error的用法

    Node.js-xmlweb是一个基于状态机理论设计的web服务器

    **Node.js-xmlweb简介** Node.js-xmlweb 是一个基于状态机理论设计的Web服务器框架,它旨在提供一种高效且易于理解的方式来构建Web服务应用。这个框架的独特之处在于其利用了状态机的设计模式,使得代码结构清晰,...

    Node.js-chaosocket模拟WebSockets并创建chaos

    `chaosocket`是一个基于Node.js的库,设计用于模拟WebSockets的交互,允许开发者创建各种混乱(chaos)场景来测试WebSocket服务器的健壮性。这个库的名字恰如其分地反映了它的目的,即在WebSocket通信中引入混乱,以...

    Node.js-基于知识分享理念而设计的企业文档管理分享与平台

    Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript编写程序,从而打破了JavaScript只能在浏览器中运行的传统。基于这一技术,我们可以构建高效、可扩展的网络应用,尤其...

    基于node.js校园活动管理系统的设计与实现-答辩PPT.ppt

    Node.js是一个基于Chrome V8引擎的JavaScript运行环境,允许JavaScript代码在服务器端执行,打破了JavaScript只能用于客户端的限制。它具有非阻塞I/O、事件驱动的特点,非常适合处理并发请求,因此在构建高效、轻量...

    nodejs安装及环境配置需要注意什么

    Node.js是一款基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行编程。在安装和配置Node.js时,有许多关键点需要注意,以确保顺利进行开发工作。以下是一些重要的步骤和注意事项: ...

    Node.js-git-unsaved扫描您的项目目录中的脏git存储库

    标题 "Node.js-git-unsaved扫描您的项目目录中的脏git存储库" 提供的信息表明,这是一个使用Node.js编写的工具,专门用于检测用户项目目录中未保存或未提交的git更改,即所谓的“脏”git仓库。在软件开发中,尤其是...

    Node.js-优秀实用的VSCode插件集合

    在Node.js开发中,Visual Studio Code (VSCode) 已经成为了许多开发者的首选编辑器,其丰富的扩展性使得开发者可以定制自己的开发环境以提高效率。以下是一些针对Node.js开发和其他杂项的优秀且实用的VSCode插件,...

    node入门-一本全面的node

    由于提供的【部分内容】是一段经过OCR扫描后的混乱文本,它不包含任何有关Node.js入门的实质性信息,因此无法从中提取出与Node.js相关的知识点。不过,我可以利用提供的标题和描述中的关键词“Node入门-一本全面的...

    Node.js 的模块知识汇总

    你可以把 Node.js 模块当作 JavaScript 库 —— 是整体代码中你想放在一起的某个部分(比如,函数集),你会想把这部分代码相对独立于代码库中的其它部分,可以把事情区分清楚。 就们我们把袜子放在衣柜一个抽屉,把...

    node.js中实现同步操作的3种实现方法

    在Node.js中,同步操作通常与异步模型相冲突,因为Node.js是以异步I/O为设计核心的。然而,在某些场景下,例如确保函数按特定顺序执行或等待一个操作完成后再进行下一个操作,同步操作是必要的。本文将详细介绍三种...

    node-segfault-handler:调试本机Node.js模块并在出现问题时获取堆栈跟踪的工具

    概述该模块是调试Node.js C / C ++本机代码模块的关键工具,可以在生产环境中安全使用。 通常,当在本机代码中触发错误时,节点进程只会以没有任何有用信息的方式结束。 在生产中,这似乎表现为工作进程似乎无缘无故...

Global site tag (gtag.js) - Google Analytics