node总结

109 阅读5分钟

1、在终端执行js文件

image.png

2、require导入

// 导入一个文件使用 require()
// 导入的内容需要用变量接收,不接收不能用
const obj = require('./03-exports导出')

// 输出接收结果
console.log(obj);
console.log(obj.a);
obj.fn1() // 接收的函数,需要调用

// 总结:导入一个文件,前缀可以省略,后缀不能省略

3、exports导出

let a = 111
let b = 11122
let c = 11133
let d = 11144

const fn1 = () =>{
console.log('fn1');
}

// 导出方式1
module.exports = {
a,b
}

// 导出方式2
module.exports.fn1 = fn1

4、三个模块

1.自定义模块:用户自己创建的每个js文件,都是自定义模块

2.内置模块(核心模块):Node安装后,即可使用的模块,Node环境自带

3.第三方模块:其他人或公司/组织开发的模块,发布到npm网站,我们需要下载使用的模块

5、fs.readFile读取文件

// 导入fs内置模块
const fs = require('fs'); // 只有自定义模块需要前缀

// 读取文件信息 - fs.readFile()是异步代码,他的结果是由回调函数返回
// 语法: fs.readFile('路径','字符集',(参数1,参数2) =>{})

fs.readFile('./data.json', 'utf8', (err, data) => {
    // console.log(err); // 读取成功就是null,读取错误是报错对象
    // console.log(data); // 读取错误是undefined
    
    // 条件判断 - 不等于Null就报错误信息,等于Null就读取data数据
    if (err != null) {
        return console.log(err.message);
    }
    console.log(data);
})

// 异步代码一般都是通过回调函数处理结果,而不是返回值
console.log('我是最后一行代码');

6、fs.writeFile写入文件

// 导入 fs 核心模块
const fs = require('fs');

// 写入内容 fs.writeFile()也是异步操作;
// 写入文件内容不需要制定编码集,而且回调函数一个参数就够了;
// 语法: fs.writeFile('路径','要添加的内容', 参数 => {})

fs.writeFile('./data.json', '今天是2022年8月1日', err => {
    // console.log(err); // 写入成功是null,写入失败是错误对象
    // 判断
    if(err) return console.log(err.message);
    console.log('添加成功!');
})

// 总结:
// 1. 如果文件存在,且已有内容,会进行覆盖;
// 2. 如果文件不存在,会创建文件;
// 3. 如果文件夹都不存在,直接报错;

7、path模块的两个方法

// 导入 path 模块
const path  = require('path');

// 定义一个路径
let url = 'www.jinqiankun.com'

// 1. 获取扩展名 path.extname()
const txt1 = path.extname(url);
console.log(txt1); // .com

// 2. 获取基础名 path.basename()
const txt2 = path.basename(url,txt1)
console.log(txt2); //www.jinqiankun

8、path.join路径

// 导入fs,path核心模块
const fs = require('fs');
const path = require('path');
// path.join()是用来拼接文件的绝对路径,要和__dirname配合使用.__dirname表示当前文件所处的目录
const url = path.join(__dirname,'./data.json')

// 读取文件
fs.readFile(url,'utf8',(err,data) =>{
// 判断
if(err) return console.log(err,message);
// 转换成JSON类型
const arr = JSON.parse(data)
// 输出结果
console.log(arr); 
})

/** 路径动态拼接的问题
 * 1. 在使用fs模块操作文件时,如果提供的操作路径是以./或../开头的相对路径时,很容易出现路径拼接错误的问题。
 *    原因是代码在运行的时候,会以执行node命令时所处的目录,动态拼接出被操作文件袋完整路径。
 * */  

9、ES6的导入导出

// Es6导入类似commomjs中的:require()
// Es6导入和require()一样,也有缓存机制;

// 导入1:默认导入,不能解构接收
import obj from './2-子模块.js'; // Es6导入,自定义模块前缀后缀不能省略;
console.log(obj);



// 导入2:按需导入,一定要解构接收
// 导入解构重命名不是用: 而是用 as
import { e as jin, f, fn } from './2-子模块.js';
console.log(jin);
console.log(f);
fn()

// 导入3:但是不接收,要使用的是功能,不是返回的数据
import './2-子模块.js'
// Es6导出类似conmmonjs中的:module.exports()

// 导出1:默认导出,不能导出多次
let a = 1;
let b = 2;
export default {
    a, b, c: 3
}


// 导出2:按需导出,可以导出多次
export let e = 123;
export let f = 'abc';
export function fn() {
    console.log('河南省');
}

// 导出3:不导出数据,让主模块使用子模块的功能
for (let i = 0; i < 3; i++) {
    console.log('刘德华!!!');
}

// 当前模块被导入,就会被立即执行;

10、微任务和宏任务

// 异步 - 宏任务
setTimeout(()=>{
 // 执行后 回调一个宏事件
 console.log('1');
},0)
// 同步代码
console.log('2');
// 同步代码
new Promise((resolve) => {
console.log('3');
resolve()
}).then(()=> {
// 异步 - 微任务
console.log('4');
}).then(() =>{
// 异步 - 微任务
console.log('5');
})
// 同步代码
console.log('6');

// 2 3 6 4 5 1
// JS优先执行同步任务,然后执行微任务,最后执行宏任务

11、promise解决回调地狱

// Es6 模块化
import fs from 'fs';

// 创建3个promise实例
const p1 = new Promise((resolve, reject) => {
    fs.readFile('./txt/01.txt', 'utf-8', (err, data) => {
        resolve(data);
    })
})
const p2 = new Promise((resolve, reject) => {
    fs.readFile('./txt/02.txt', 'utf-8', (err, data) => {
        resolve(data);
    })
})
const p3 = new Promise((resolve, reject) => {
    fs.readFile('./txt/03.txt', 'utf-8', (err, data) => {
        resolve(data);
    })
})
const p4 = new Promise((resolve, reject) => {
    fs.readFile('./txt/04.txt', 'utf-8', (err, data) => {
        resolve(data);
    })
})

// 读取数据输出结果 - then()返回的是一个Promise对象
const aaa = p1.then(res => {
  console.log(res);
  // then()的返回值,取决于then()中的回调函数的返回值
  return p2;
})
// 读取 p2 中的数据,可以直接读取 aaa 里面的内容
const bbb = aaa.then(res => {
    console.log(res);
    // then()的返回值,取决于then()中的回调函数的返回值
    return p3
  })
  // 读取 p3 中的数据,可以直接读取 bbb 里面的内容
  const ccc = bbb.then(res => {
    console.log(res);
    // then()的返回值,取决于then()中的回调函数的返回值
    return p4;
  })
  // 读取 p4 中的数据,可以直接读取 ccc 里面的内容
  const ddd = ccc.then(res => {
    // ccc.then()不需要返回值了,因为已经是最后一个文件了;
    console.log(res);
  })

1-Webpack

// 1.在项目中安装webpack
  npm install webpack@5.42.1 webpack-cli@4.7.2 -D(-S是 --save的简写;-D是 --save-dev的简写)
// 2.在项目根目录中,创建名为webpack.config.js的配置文件
    module.exports ={
     mode:‘development’
    }
// 3.在package.json的scripts节点下,新增dev脚本,用于启动webpack(npm run dev)
  scripts:{
   ‘dev’:‘webpack’
  }