1、在终端执行js文件
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’
}