likes
comments
collection
share

从Node.js CommonJS到ES6 Modules: 无缝过渡与性能升级实战指南

作者站长头像
站长
· 阅读数 30

前言

对于前端,就是选择元素、事件、操作和效果,早期是没有模块化系统的,数据库放在mysql里,模块放在views里面,逻辑放在各个文件里面,所以跨文件处理便是家常便饭,下面介绍两种文件处理方式:node commonJS(require)es6 module(import)

正文

node commonJS(require):通过require导入第三方库fs

(文件后缀为.js)

  • 创建一个hello.txt文件:

从Node.js CommonJS到ES6 Modules: 无缝过渡与性能升级实战指南

  • 通过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)

  1. 对hello.txt文件进行读取
import fs from 'node:fs';

// 回调函数
// err 出错了? 后端比较复杂
fs.readFile('./hello.txt', 'utf-8', (err, data) => {
    // 二进制
    // 文件在硬盘里是以二进制的方式存储的
    console.log(data);
})
  1. 新建一个test.txt,对该文件进行读取

从Node.js CommonJS到ES6 Modules: 无缝过渡与性能升级实战指南

  • 同步读取:
// es6 module 后端 + 新的模块
import fs from 'fs';
// ajax , 同步写法
const syncData = fs.readFileSync('./test.txt', 'utf-8');

console.log(syncData);
console.log('hello~');

从Node.js CommonJS到ES6 Modules: 无缝过渡与性能升级实战指南

  • 异步读取:

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~');

从Node.js CommonJS到ES6 Modules: 无缝过渡与性能升级实战指南

  • 异步很好,回调地狱(代码可读性不好),但是可以优化,通过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~');

从Node.js CommonJS到ES6 Modules: 无缝过渡与性能升级实战指南

  • 通过readFileSync同步读取:
import fs from 'fs';
// 同步  线程阻塞  
const buf = fs.readFileSync('./test.txt');
console.log(buf, buf.length);
buf.write('tt');
console.log(buf.toString());

从Node.js CommonJS到ES6 Modules: 无缝过渡与性能升级实战指南

  1. 新建文件夹newTest.txt

从Node.js CommonJS到ES6 Modules: 无缝过渡与性能升级实战指南

  • 通过statSync输出文件状态
import fs from 'fs';

// status
try {
    console.log(fs.statSync('./newTest.txt'));
} catch(err) {
    console.log('文件不存在');
}

结语

从Node.js CommonJS到ES6 Modules: 无缝过渡与性能升级实战指南

转载自:https://juejin.cn/post/7382485031896760370
评论
请登录