、
node.js
- CLI 和 REPL
- __dirname当前文件夹目录
node执行顺序:同步(宏(console,setTimeout(fn,0))>微(promis-破迷思))>异步
注意setTimeout是宏任务但是里面的fn是异步
1、CLI (命令行,例如:cmd)和 REPL (Read Eval Prin Loop)读取、执行、输出、再次读新的
/*
__dirname:当前文件(模块)所在目录
__filename:当前文件(模块)的文件名称(包含文件绝对路径)
模块化:
导出:exports 对象
导入:require方法
require(模块id/路径)
返回被导入模块的 exports 对象
//REPL-常用的命令 :
//.break(退出编辑) .clear(退出编辑) .exit(退出软件) .help(查看有什么命令) .save 文件名.js(执行的代码保存到文件) .load 文件名.js(加载一个js文件进入) .editor()
*/
2、 node.js基础模块
//dirname查看文件地址
//通过require函数导入、exports对象导出 module.exports
//es6导出对象export 、 导入import import {xxx} from ‘文件路径’
//node.js内置模块:
//Event、process、buffer、fileSystem
//srteam
FileSystem
//FileSystem fs
//CURD:
//它代表创建(Create)、更新(Update)、读取(Retrieve)和删除(Delete)操作。
// const fs = require('fs');//导入fs模块
// write
// 写入数据到文件
// fs.writeFile(file, data[, options], callback)
// input/output => i/o 操作 => 流 二进制 => buffer
// 数据(字符串,音频,视频,二进制) => buffer => stream
// 如果文件不存在,则创建
// 如果目录不存在,创建文件就会失败
// First Error : node中一种约定,如果一个回调可能有错误发生,那么约定回调函数的第一个参数专门用来提供错误对象。
// fs.writeFile('./1.txt', 'Miaov', (err) => {
// // console.log(err);
// // console.log('文件写入成功');
// if (err) {
// console.log('写入失败');
// } else {
// console.log('写入成功');
// }
// });
// let res = fs.writeFileSync('G:/aaa/1.txt', 'Miaov');
// console.log(res);
// try {
// // fs.writeFileSync('G:/aaa/1.txt', 'Miaov');
// fs.writeFileSync('./1.txt', 'Miaov');
// console.log('写入成功');
// } catch(e) {
// console.log('写入失败');
// }
// 追加内容
// fs.appendFileSync('./1.txt', '我是追加的内容');
//let content = fs.readFileSync('./1.txt');
//console.log(content);
// 获取文件其他信息
// let info = fs.statSync('./1.txt');
// console.log(info);
// console.log(info.isFile());
// 删除文件
// fs.unlinkSync('./1.txt');
// 文件夹
// 创建,不会进行递归创建
// fs.mkdirSync('./a/b/c');
// fs.mkdirSync('./a');
// 不能非空文件夹
// fs.rmdirSync('./a');
// let dirPath = './a';
// let files = fs.readdirSync(dirPath);
// // console.log(files);
// files.forEach( child => {
// // 删除每一个子文件
// fs.unlinkSync(dirPath + '/' + child);
// } );
// fs.rmdirSync(dirPath);
// rmdir('./a');
// // 递归删除文件夹
// function rmdir(dirPath) {
// let files = fs.readdirSync(dirPath);
// // console.log(files);
// files.forEach( child => {
// let childPath = dirPath + '/' + child;
// // 当前child可能是文件也有可能是文件夹
// if ( fs.statSync(childPath).isDirectory() ) {
// //因为文件夹里面可能还会有子文件,所以也不能直接删除
// //而是需要调用rmdir方法
// // fs.rmdirSync();
// rmdir(childPath);
// } else {
// // 删除每一个子文件
// fs.unlinkSync(childPath);
// }
// } );
// fs.rmdirSync(dirPath);
// }
//const fs = require('fs');
// 当文件发生改变的时候,触发回调
// fs.watchFile('./data.txt', e => {
// // console.log('changed');
// //e : 类似事件对象,保存当前变化的细节
// console.log(e);
// });
// 监听文件或目录
//fs.watch('./a', (eventType, filename) => {
// eventType: change rename
// filename: 当前发生改变的具体文件
//console.log(eventType, filename);
});
-------------fs的小练习---------------------
/**
* usage : node miaov app -i
* miaov : 我们的脚本文件
* app : 要生成的项目的名称
* -i : 参数,表示要同时产生index.html文件
*/
//const fs = require('fs');
// 获取用户要生成的项目名称,process
// console.log(process.argv);
//let appName = process.argv[2];
// 根据项目名称生成指定的目录
//let appRoot = __dirname + '/' + appName;
// console.log(appRoot);
//if ( fs.existsSync(appRoot) ) {
// console.log('项目已经存在了,请勿重复创建!');
// process.exit();
// }
// fs.mkdirSync( appRoot );
// fs.mkdirSync( appRoot + '/images' );
// fs.mkdirSync( appRoot + '/css' );
// fs.mkdirSync( appRoot + '/js' );
// 判断是否存在 -i 的选项
// if ( process.argv.includes('-i') ) {
// fs.writeFileSync(appRoot + '/index.html', `
// <!DOCTYPE html>
// <html lang="en">
// <head>
// <meta charset="UTF-8">
// <meta name="viewport" content="width=device-width, initial-scale=1.0">
// <meta http-equiv="X-UA-Compatible" content="ie=edge">
// <title>App</title>
// </head>
// <body>
// <h1>App</h1>
// </body>
// </html>
// `);
// }
// console.log('项目创建完成!');
// process.stdout.cursorTo(0,0);
// process.stdout.write('() aaaa \r\n');
// process.stdout.write('(+) bbbb \r\n');
// process.stdout.write('() cccc \r\n');
buffer
/**
* 位 -> 字节
*
* ascii
*/
// process.stdin.on('data', (data) => {
// console.log(data);
// });
// let bf1 = new Buffer(4); //长度
// console.log(bf1);
// bf1[0] = 96; //二进制值
// bf1[0] = '中';
// bf1[4] = 96;
// console.log(bf1);
// let bf2 = new Buffer('miaov');
// let bf3 = new Buffer('妙味');
// console.log( bf2 );
// console.log( bf3 );
// console.log( '妙味'.length, bf3.length );
// let bf4 = new Buffer(10);
// bf4.fill(0x60, 2, 4);
// console.log(bf4);
let bf5 = Buffer.from('miaov');
let bf6 = Buffer.from('miaov');
// console.log(bf5, bf6);
// console.log(bf5 == bf6); //比较地址
// [1,2,3] == [1,2,3]
// console.log( bf5.equals(bf6) );
console.log( '妙味'.length );
console.log( Buffer.byteLength('妙味') );
// 基础概念,并不能够直接用于实现某个具体的效果,但是,我们
// 后面的一些效果的使用会经常涉及到这些基本原理的东西
// 后端(围绕 - 数据操作)
Event
const EventEmmiter = require('events');
// class Person extends EventEmmiter {
// constructor(name) {
// super();
// this.name = name;
// this.age = 0;
// this.growup();
// }
// growup() {
// setInterval(() => {
// this.age++;
// this.emit('growup');
// }, 1000);
// }
// }
// const p1 = new Person('eeee');
// // p1.setMaxListeners(1);
// p1.addListener('growup', function() {
// console.log('长大了一岁');
// });
// // p1.prependListener('growup', function() {
// // console.log('...');
// // });
// // console.log(p1.eventNames());
// // document.body.addEventListener('click')
// // document.body = new HTMLBodyElement();
process、
// argv : 用来获取当前运行node程序的相关参数
// console.log( process.argv );
// if (process.argv.includes('-v')) {
// console.log('v1.0.0');
// }
// console.log( process.env );
let i = 0;
setInterval(() => {
i++;
console.log(i);
if (i > 10) {
process.exit();
}
}, 1000);
bu
node执行顺序演示
/ console.log(1);
// setTimeout(function() {
// console.log('定时任务1');
// }, 2000);
// setTimeout(function() {
// console.log('定时任务2');
// }, 100);
// setTimeout(function() {
// console.log('定时任务3');
// }, 100);
// console.log(2);
// for (var i=0; i<100000; i++) {
// }
/**
*
console.log('script start');
console.log('script end');
new Promise(resolve => {
console.log('promise start');
resolve();
})
.then(function() {
console.log('promise1');
}).then(function() {
console.log('promise2');
});
*
*
* event loop
* setTimeout(function() {
console.log('setTimeout');
}, 0);
同步代码
(宏,微)
event loop
*/
// console.log('script start');
// setTimeout(function() {
// new Promise((resolve)=>{}).then()
// setTimeout(function() {
// }, 0);
// }, 0);
// new Promise(resolve => {
// console.log('promise start');
// setTimeout(() => {
// console.log('setTimeout2');
// resolve();
// }, 1000)
// }).then(function() {
// console.log('promise1');
// }).then(function() {
// console.log('promise2');
// });
// console.log('script end');
setTimeout(() => {
// 宏任务
new Promise(resolve => {
console.log('promise')
resolve();
}).then(() => {
//微任务
console.log('then')
});
// 宏任务
console.log(1);
// 宏任务
setTimeout(() => {
console.log(1)
}, 1000);
}, 1000);