Node.js
Node.js
Node.js基础
概念
简单的说 Node.js 就是运行在服务端的 JavaScript。
Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。
Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。
Chrome V8引擎
浏览器内核引擎主要分为两类:
- 渲染引擎:能够将HTML/CSS/JavaScript文本及相应的资源文件转换成图像结果。渲染引擎的主要作用是将资源文件转化为用户可见的结果。
- JavaScript引擎:能够解析和编译 JavaScript 代码。
V8引擎是一个JavaScript引擎实现,最初由一些语言方面专家设计,后被谷歌收购,随后谷歌对其进行了开源。V8使用C++开发,在运行JavaScript之前,相比其它的JavaScript的引擎转换成字节码或解释执行,V8将其编译成原生机器码,并且使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序在V8引擎下的运行速度媲美二进制程序。V8支持众多操作系统,如windows、linux、android等,也支持其他硬件架构,如IA32,X64,ARM等,具有很好的可移植和跨平台特性。
下载安装
下载
安装包可以在Node.js官网下载,文档可参考Node.js中文网。
安装
傻瓜式安装,除了路径啥都不用改,一路next。
环境变量会自动配置。
测试
-
查看版本号
node -v
-
跑个hello world
node hello.js
模块化
在ES6 之前,前端是没有模块化的语法的。程序员们就通过一些插件(例如:require.js 和 sea.js)来实现前端的模块化。但是从 ES6 开始,JS 就原生支持模块化了。
模块化规范:
- AMD
- CMD
- CommonJS
- ECMAScript 2015
前端模块化
JS文件设置为模块
在 HTML 中引入 JS 文件时,添加一个 type="module"
的属性,可以将该 JS 文件设置为一个模块化文件:
<script src="./index.js" type="module"> </script>
加载模块
在一个模块中加载另一个模块import ' 相对路径 '
:
import './js/a.js';
import './js/b.js';
暴露与引入
-
在一个 JS 文件中通过
export
暴露数据出去:// a.js export var num = 100; export function foo() { console.log('b.js foo'); }
-
在一个 JS 文件中,默认只暴露一条数据出去,可以通过
export default
来进行暴露:// b.js var num = 100; export default num;
-
通过
export
暴露的数据在另一个 JS 文件中通过import from
来加载文件并获取数据,可使用as
更改变量名:import { num as n, foo } from './a.js';
-
通过
export default
暴露的数据在另一个 JS 文件中,在import from
时可以任意变量命名来接收暴露的数据:import b from './b.js';
后端模块化
CommonJS
CommonJS是 Nodejs 的服务端规范。CommonJS 中规定,每一个 JS 文件都是一个独立的模块,模块与模块之间都有自己独立的作用域,默认情况下,互相之间不能进行数据的访问。
require()
require()
用于在JS文件中引入另一个JS文件,可设置引入的文件路径。
require('./a.js');
通过 require
引入的文件,都会运行加载。
路径规则
- 同级目录之间,路径必须加
./
。 - 引入的 JS 文件的后缀名
.js
可以省略。 - 路径中只有一个文件名,默认该文件加载的是 Nodejs 自带的模块或第三方下载的模块。
模块缓存
当我们通过 require()
首次加载完一个模块后,Nodejs 会将该模块进行缓存。后续再加载该模块时,会直接从缓存中读取该模块。
换句话说,同一个文件被 require 多次,只会执行一次。
暴露与引入
默认情况下,Nodejs 中的 JS 文件互相之间不能进行数据的访问,如果需要进行数据交换,那么就需要经过以下两个步骤:
-
在一个 JS 文件中把数据通过
module.exports
暴露出去:module.exports.num = 10; module.exports = { num: 10 };
-
在另一个 JS 文件中通过
require()
引入进来:const aJS = require('./a.js'); const { num } = require('./a.js');
Nodejs 内置模块
fs文件系统
-
引入
const fs = require('fs');
-
异步读取文件
fs.readFile('./test.txt', 'utf-8', function (err, data) { if (err) { console.log('文件内容读取失败'); } else { console.log('文件内容读取成功', data); } });
-
同步读取文件
try { const data = fs.readFileSync('./test.txt', 'utf-8'); console.log('文件内容读取成功', data); } catch (error) { console.log('文件内容读取失败'); }
-
覆盖写入
fs.writeFile('./test.txt', '这是新写入的内容', function (err) { console.log('err', err); }); fs.writeFileSync('./test.txt', '这是同步新写入的内容');
-
追加写入
fs.appendFile('./test.txt', '\n这是追加的新内容', (err) => { console.log(err); }) fs.appendFileSync()
-
复制文件内容
fs.copyFile('./test.txt', './newTest.txt', (err) => { console.log(err); })
-
删除文件
fs.unlink('./newTest.txt', err => { console.log(err); })
-
重命名文件
fs.rename('./bbb.txt', './data/bbb.txt', err => { console.log(err); })
-
创建文件夹
fs.mkdir('./data/b', (err) => { console.log(err); }); fs.mkdirSync('./data/a')
-
删除文件夹
只能删除空文件夹
fs.rmdir('./data', err => { console.log(err); })
-
读取文件夹内容
fs.readdir('./data/b', (err, data) => { console.log('err', err); console.log('data', data); })
-
判断文件\文件夹是否存在
fs.access('./dat', (err) => { if (err) { console.log('不存在'); } else { console.log('存在'); } })
-
查看状态
fs.stat('./data', (err, stats) => { console.log('是不是文件', stats.isFile()); console.log('是不是文件夹', stats.isDirectory()); })
path路径
- 引入
- 未完终端
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了