从Node.js CommonJS到ES6 Modules: 无缝过渡与性能升级实战指南
前言
对于前端,就是选择元素、事件、操作和效果,早期是没有模块化系统的,数据库放在mysql里,模块放在views里面,逻辑放在各个文件里面,所以跨文件处理便是家常便饭,下面介绍两种文件处理方式:node commonJS(require)
和es6 module(import)
。
正文
node commonJS(require)
:通过require导入第三方库fs
(文件后缀为.js
)
- 创建一个hello.txt文件:
- 通过fs第三方库里的readFile来实现对该文件的读取:
const fs = require('fs');
fs.readFile('./hello.txt', 'utf8', (err, data) => {
if (err) {
console.log(err);
}
else {
console.log(data);
}
})
console.log('start');
分析:
运行一下就会发现会先输出start
,再输出hello world
,因为readFile
为异步任务,所以会先输出start
,再输出hello world。
- 通过promise来实现文件读取:
const fs = require('fs');
const fsPromise = () => {
return new Promise( (resolve, reject) => {
fs.readFile('./hello.txt', 'utf8', (err, data) => {
if (err) {
reject(err);
}
else {
resolve(data);
}
})
})
}
fsPromise().then( (data) => {
console.log(data);
}).catch( (err) => {
console.log(err);
})
es6 module(import)
:通过import来导入fs库
(文件后缀为.mjs
)
- 对hello.txt文件进行读取
import fs from 'node:fs';
// 回调函数
// err 出错了? 后端比较复杂
fs.readFile('./hello.txt', 'utf-8', (err, data) => {
// 二进制
// 文件在硬盘里是以二进制的方式存储的
console.log(data);
})
- 新建一个test.txt,对该文件进行读取
- 同步读取:
// es6 module 后端 + 新的模块
import fs from 'fs';
// ajax , 同步写法
const syncData = fs.readFileSync('./test.txt', 'utf-8');
console.log(syncData);
console.log('hello~');
- 异步读取:
fs.readFile('./test.txt', 'utf-8', (err, data) => {
if (!err) {
console.log(data);
fs.readFile('./hello.txt', 'utf-8', (err, data) => {
if (!err) {
console.log(data);
}
})
}
});
console.log('hello~');
- 异步很好,回调地狱(代码可读性不好),但是可以优化,通过
promise
进行链式调用
fs
.promises
.readFile('./test.txt', 'utf-8')
.then(promiseData => {
console.log(promiseData);
})
- 链式调用虽然将代码流程扁平化,但是可读性不好,通过
async
实现异步读取
;(async() => {
// 跟同步差不多
const data = await fs.promises.readFile('./test.txt', 'utf-8');
console.log(data);
})();
console.log('hello~');
- 通过
readFileSync
同步读取:
import fs from 'fs';
// 同步 线程阻塞
const buf = fs.readFileSync('./test.txt');
console.log(buf, buf.length);
buf.write('tt');
console.log(buf.toString());
- 新建文件夹newTest.txt
- 通过
statSync
输出文件状态
import fs from 'fs';
// status
try {
console.log(fs.statSync('./newTest.txt'));
} catch(err) {
console.log('文件不存在');
}
结语
转载自:https://juejin.cn/post/7382485031896760370