在我举办的 Node.js 研讨会、开设的课程以及编撰的书之中 (尤其是我在线教学的时候),最大的受众便是 Java 开发者。因为在很久以前,作为一位专业的软件开发人员,你必须得知晓 Java 这门语言。然而现在情况大不相同,Node.js 以及其他语言诸如 Go、Elixir、Python、Clojure 的蓬勃发展,表明工程师们更倾向选择多语言环境作为他们的开发工具。
Node.js,一种跑在服务器上的 JavaScript 运行时,设置起来既简单又快速,因此在从前属于 Java 的服务器领域中广受好评。这篇文章将用以下几个小节,帮助 Java 开发者向 Node 转型:
既然你是一名 Java 开发者,那么就请允许我用你熟悉的 Java 名称和概念来介绍 Node 术语:
相当于
- console.log('Hello')
- System.out.println("Hello");
相当于
- node debug
(都是命令行调试器)
- jdb
只要把以上的推论熟记于心,就能够加速 Node 学习。
这其中有几条的说法比较牵强,比如 MongoDB 属于 NoSQL 而 Oracle 几乎可以说是一个 SQL 数据库。
既然已经介绍了一些 Node 基本术语,接下来我们将面对一些常见问题,在我的直播课程中经常有人提出这一类问题,即 Node/JavaScript 与 Java 的区别。
在 Node/JavaScript 中,类型非常宽松。每一个变量都能够存储任何类型的数据,也就是说,是存储在变量中的数据决定了这个变量的类型,而非变量本身。例如:
- let str = 10
- console.log(typeof str) // -> number
- str = '现在这是个字符串了'
- console.log(typeof str) // -> string
同样在函数的声明中,不需要为函数参数指定类型。例如,参数
可以是一个数字类型也可以是一个函数,因为它是一个可选的参数:
- page
- const f = function (limit, page, callback) {
- if (typeof page == 'function' && !callback) {
- callback = page
- page = 1
- }
- // ...
- return callback()
- }
- f(10, ()=>{}) // 可行
- f(10, 2, ()=>{}) // 同样可行
Node 模块是本地存储的。存放模块所占用的空间不足挂齿,但是解决项目中模块之间的冲突所花去的时间至关重要。
Java 通常将项目中的外部依赖放在一个全局文件夹中。
而 Node 和 npm 则将项目中的外部依赖存放在项目子文件夹
中。通过此种方式,Node 各个项目能够使用任何不同版本的模块而不会在项目之间引起冲突。
- node_modules
或者
- node-static
(本地开发用 Web 服务器、静态内容) 除外。甚至像 WebPack 这类工具也需要安装进本地的
- http-server
文件夹。 正确的安装姿势:
- node_modules
- npm i express
错误的安装姿势:
- npm i -g express
Node 是一个非阻塞输入 / 输出平台,可以帮助你更好地搭建高性能 Web 应用。(Java 中同样有 Play 或者 NIO 这类的框架用以类比 Node,然而这些框架并不如 Node 这样的平台底层,并且还更加复杂。)
你需要将自己的编程思维从同步转换到异步,放弃从前那些用请求、数据库或文件读写来阻塞代码执行的方式。在 Node 中,开发者将充分挖掘回调 (Callbacks) 的力量(同时自由选择是否使用 Promises、async/await 等等)。
- fs.writeFile('message.txt', 'Hello Node.js', (error) = >{ // 可能要耗费很长时间!
- if (error) console.error(error);
- console.log('保存完成!')
- })
- // 还没有写完文件,下一个周期将回到这里
这种为非阻塞 I/O 提供支持的机制叫做事件轮询 (Event Loop),是直接从 Google Chrome V8 引擎中拿来用的。欲知详情请参见这篇文章:。
本文仅是简介,如果希望更多地了解 Node 以及其设计模式 (包括 async) 和最佳实践,可以戳下面的链接:
来源: