Create by fall on —— Recently revised in 13 Oct 2023
node.js
node.js 官方网站:https://nodejs.org node.js 中文网:http://nodejs.cn
简介
node.js 是一个使用 JavaScript 语言,基于 Chrome V8 引擎构建的开发平台
js 能使用除依赖浏览器的 BOM、DOM 等,大多数语法都能在 node.js 上进行使用,并且 node 提供了一些能够操作文件的 API。
也就是说,JS 语言,既可以做前端,又可以使用 node 做后端。
其它 JS 引擎
- Firefox 有
SpiderMonkey
- safari 具有
JavaScriptCore
(又称为Nitro
)- Edge 有
Chakra
所有这些引擎都实现了 ECMA ES-262(ECMAScript)标准
V8 引擎使用 C++ 编写,通常被认为是一门解释型语言,但是现代的 JavaScript 也会对其进行编译。JavaScript 是由 V8 在其内部编译的,使用了即时编译(JIT:Just In Time)以加快执行速度。
开发
node.js 的优势
- 事件驱动(事件出发时,执行并传递过去的回调函数)
- 非阻塞 I/O 模型(IO 操作时不会阻塞线程)
- 拥有世界最大的开源库生态系统 ----
npm
通过 node 可以开发:
- 控制台程序(命令行程序、CLI 程序)
- 桌面应用程序(GUI:Graphical User Interface),借助
node-webkit
、electron
等框架 - 开发 web 应用程序,处理前端请求
node.js 开发工具,帮助更好地进行开发
- 提供基础工具和包管理工具: yarn、pnpm
- 规范化代码的工具、eslint、prettier
- 测试相关 tdd / bdd 测试覆盖率
- 构建和前端工程化相关 gulp、webpack、rollup、Vite,和他们的插件
- node 中间层
- 客户端应用 node.js 如:electron
应用场景
开发 web 应用程序
- 请求:客户端发起请求
- 处理:服务器处理请求
- 响应:服务器将处理结果发送到客户端
node.js 开发 web 应用程序和 PHP、Java、ASP.Net 等传统开发 Web 应用程序的区别在于,传统模式必须有 Web 容器(比如说 apache 服务器,负责对网络数据进行解析和请求)
网站开发技术栈
PHP 语言:LAMP - Linux Apache MySQL PHP(全栈开发技术栈)
node.js 全栈开发技术栈:MEAN - MongoDB Express Angular Node.js
Angular 可以替换为 Vue 或者是 React,express 已经成为 node 后端开发基础
新技术:
TypeScript:为 JS 添加类型注解,拥有强类型语言的功能
Nuxt、Next:以 Vue、React 为基础的服务端渲染(SSR)方案
Nest:google 推出,提供一套类似于将 Spring JS 化的框架。
node 的架构
- chrome 内核
- libuv,提供了一些 net、http、fs
开发
命名规则
配置代码缩进为两个空格
JavaScript 文件命名规则
- 不要用中文
- 不要包含空格(用
-
划分单词) - 不要出现 node 关键字,比如不能命名为 node.js。
输出到命令行
console.log('我的%s已经%d岁', '猫', 2)
和 C 语言很像
%s
会格式化变量为字符串%d
会格式化变量为数字%i
会格式化变量为其整数部分%o
会格式化变量为对象
计算耗时
利用
console.time()
和console.timeEnd()
计算执行某个函数的耗时
stdout 和 stderr
console.log 非常适合在控制台中打印消息。 这就是所谓的标准输出(或称为
stdout
)。
console.error
会打印到stderr
流。它不会出现在控制台中,但是会出现在错误日志中。
CommonJS
最开始没有 ES6 的模块化概念,因此 node 使用 Commonjs 规范,进行补充模块化开发。
package.json 中可以设置
"type":"module"
即可启用 ES6 import 方式的导入(实验功能,node 版本 >16)
node 模块分为全局模块和非全局模块
全局模块,不需要被调用就可以使用,process
模块在使用的时候,无需通过 require()
函数来加载该模块,可以直接使用。
非全局模块,需要调用才能进行使用,由于 node 最初是使用 common.js 规范,所以引入模块的方式是
const fs = require('fs')
// 可以导入并使用 fs 模块。并且每个独立的文件的对象和变量都是私有的,不会公开给外界。
模块化
如果代码文件不能进行交互,添加功能就要在一个文件中实现,这个文件写的多厉害,多么方便查看,对于一个人来说,不断地查找上下文,耗时耗力。如果文件出错,整个项目都无法运行,所以出现CommonJS,让多个文件组成一个项目,并且让 JS 语言具有开发大型项目的能力。
Commonjs,作为模块化标准,node.js 作为 CommonJS 的技术实现。
Node中,提供的模块分为两类,
- 核心模块:Node提供的,称为核心模块。核心模块在 Node 源代码的编译过程中,编译进了二进制执行文件,所以它的加载速度是最快。http模块,fs模块,url模块。
- 文件模块:用户编写的模块
两个对象
默认导出
// test.js 文件,用作向外暴露接口
module.exports = function(){
console.log("这就是调用的东西")
}
// 其他文件使用 test.js
var ss = require("./test")
ss()
普通导出
// test.js
exports.world = function(){
console.log('hello')
}
// 其他文件进行使用时
const hello = require('./test.js')
hello.world()
require 的查找顺序
-
首先在文件模块缓存区
-
是否是原生模块,如果是,并且在文件缓存区,直接加载,不在缓存区进行加载原生模块,然后放入缓存区。
-
查找文件模块,根据扩展名载入,并且进行缓存
-
当前 node.js(16) 仍然默认启用 CommonJS 规范,所以,不支持
import
导入其他的包。 -
所有代码都运行在模块作用域,不会污染全局作用域。
-
模块可以被多次加载,但只会运行一次,然后将结果进行缓存,之后调用会直接调用缓存的结果,如果不想再调用,必须清除缓存
-
模块的加载顺序和代码顺序相同。
-
CommonJS 规范是服务器规范,一般先下载到本地再调用。
-
读取速度非常,快采用同步的执行方式。
浏览器为何不能兼容CommonJS
缺少四个环境变量:module/exports/require/global
规范对比
ESM 模块和 CommonJS 模块的差异:
CommonJS
模块输出的是一个值的拷贝(一旦输出一个值,模块内部的变化就影响不到这个值),ES6
模块输出的是值的引用(是动态引用且不会缓存值,模块里的变量绑定其所在的模块,等到脚本真正执行时,再根据这个只读引用到被加载的那个模块里去取值);CommonJS
模块是运行时加载,ES6
模块是编译时输出接口;CommonJS
模块的require()
是同步加载模块,ES6
模块的import
命令是异步加载,有一个独立的模块依赖的解析阶段;
其它技术对比
和 java 后端的区别?
对比于 java,node 的优势在什么地方?
对比 java,node 的优点?java 在国内,无论是什么项目,java 都是后端首选。选择 node,一般会利用其高并发的特性,或是作为 SSR 方案。
什么是 | node | java | |
---|---|---|---|
什么情况下会使用 | 用途 | SPA 的打包,代码检查,转换,提供前端开发需要的工具 | 做后端,连接数据库,对用户进行验证,前端内容部署 |
找工具的地方,查工具的地方 | 包管理工具 | 最大的软件包管理工具 npm(任何人都可以发布包) | Java 包管理器是 Maven。 |
为什么选择一种,放弃另一种 | 选择 | 新的使用,都是创造,需要比较大的投入 | 有做好的项目,之前系统是 java 做的,一些国产数据库,驱动就是 java,因此已有更成熟 |
面向那些人去使用 | 需求 | 希望在新的技术上有作为,开拓市场的公司 | 主要面向业务的需求 |
什么时候使用 | 用途 | 为 I/O 密集型应用提供服务(请求量大) | 后端集成 |
我有需求,快速实现? | 生态 | 涵盖了比较多的需求,建设较为完善 | 涵盖了相当多的需求,已经很完善 |
总结 | 适合初创企业,在只有前端的情况下也能完成大部分的业务逻辑,前端人员上手更快 | 面向业务逻辑,2B、2C 都是最好的选择。 |
前端项目开源最多,查找资料的时候,前端资料更容易查找(最先接触到的就是前端的社区),为何选择?不要舍近求远(成本):我是前端,学 java 就是重头开始,重要的是后端逻辑和思维,以及负责的内容,为了写 java 代码而学后端。
相比于其他运行时
Bun:与使用 V8 的 Deno 和 Node 不同,Bun 是一个基于 WebKit 的 JavaScriptCore 构建的 JavaScript 运行时替代方案。
Deno:开箱直接使用,并且默认支持 TS
参考文章
文章名称 | 链接 |
---|---|
Node - 从0基础到实战企业官网 | https://juejin.cn/post/6844903745755545614 |