访问核心API成员,使用require(‘核心成员的名称’)就可以导入并使用
fs核心模块提供的方法:
fs.readFile(三个参数):读取指定目录下的文件.
文件读取:
//导入fs模块
const fs = require('fs');
//读取文件
fs.readFile('文件路径/文件名', 'utf-8', (err, data) => {
if(err) return console.log('文件读取失败'+err.message);
console.log('文件读取成功内容是'+data); //读取的文件内容
})
写入文件(如果之前文件已经存在则覆盖)
//导入fs模块
const fs = require('fs');
//写入文件
fs.writeFile('文件路径/文件名', '写入的内容', err => {
if(err) return console.log('文件写入失败');
console.log('文件写入成功');
})
向指定文件追加内容(如果文件不存在就创建一个新的文件并追加内容)
//导入fs模块
const fs = require('fs');
//写入文件
fs.appendFile('文件路径/文件名', '追加的内容', err => {
if(err) console.log('文件追加失败');
console.log('文件追加成功');
})
//追加的内容前面加 \n就是另起一行.
fs模块中的路径操作问题
- 原因:node命令运行时,如果fs模块调用的方法的路径是相对路径(./ …/ ) ,那么就会把node命令运行时所在的磁盘目录去拼接这个相对路径,容易造成路径拼接错误.
- 解决办法:在nodejs中,请使用__dirname + 相对路径名解决路径问题,注意不要 ./路径/文件名,直接 /路径/文件名.
- 注意:dirname 保存的是执行的时候 当前这个文件 所在的绝对路径.
- 不同:
__dirname表示当前这个文件执行的时候,所处的根目录,只是代表一层目录而已.
__filename表示当前这个文件的完整路径,路径中包含了具体的文件名(本身的文件名)
读取文件信息
const fs = require('fs');
fs.stat(__dirname + '/files', (err, stats) => { //此时路径是目录
if(err) console.log('读取失败');
console.log(stats.size); //文件的字节, 如果是目录则为0
console.log(stats.birthtime); //文件或者目录创建时间
console.log(stats.isFile()); //是否为文件
console.log(stats.isDirectory()); //是否为目录
})
拷贝文件信息,目标文件存在则覆盖
const fs = require('fs');
fs.copyFile(__dirname + '/files/2.txt', __dirname + '/files/copy.txt', (err, data) => {
if(err) console.log('文件拷贝失败');
console.log('文件拷贝成功');
})
path.join
用来拼接路径:
//引入path模块
const path = require('path');
//拼接路径
path.join('路径', '路径', '路径'...);
//path.join() 路径拼接时,路径名 ./路径 和 /路径 效果是一样的 .识别 / 和 \都可以识别.
path.join('c:/', './b') === path.join('c:/', '/b')
path.join('c:/','a','./b','/c','.d/e','f','../g') //c:\a\b\b\d\e\g.
用于配合__dirname使用
let arr = dataStr.split(") 将数组分割成字符串.
以后只要是fs模块路径拼接 一定要用path.join()方法.
单线程和异步的概念
JS解析和执行一直是单线程的,执行栈里的任务,遇到耗时的交给浏览器,开启子线程执行完成异步任务 栈里的事做完后 ,事件循坏查找任务队列找到异步任务比如回调函数,查到了放到执行栈执行,node环境和浏览器环境可以开启多线程.node大量使用异步的好处:提高耗时的任务的执行效率,提高JS解析引擎的工作效率.
模块化
就是一种约定,一种规范,一种开发思想
可以解决文件之间的依赖关系,减少不必要的沟通成本,方便各个模块之间的调用.
CommonJS规范
- 是一套js的模块化规范,规定了模块的特性和各模块之间如何相互依赖.
- 一个js文件就是一个模块
- require() 导入其它模块,它是同步的 require查找规则
- module.exports 暴露一个模块
- 同步加载,不适用于浏览器端
node中的作用域
-
模块作用域:每一个JS文件都是各自独立的模块,每个js文件都是一个独立的作用域,外界在require这个js文件时,默认无法访问js文件中的任何私有成员(定义的方法,变量).
-
全局作用域:global作用域,类似于浏览器中的window,属于node环境中的全局对象.不推荐使用,会全局变量污染.
//模块中定义全局变量 global.a = 1; //以下这种定义方式是属于模块私有的变量,模块作用域有用 let a = 1; console.log( { } === { } ) ///false 比较的是两对象具体引用的地址
模块作用域
- module:模块标识,是一个对象,表示当前这个具体的JS模块.
- require:引用模块.使用require能够很方便的导入其他模块中的成员.
- exports:暴露模块成员,将私有成员暴露给外界使用.
- 一个模块作用域中,向外暴露私有成员,永远以module.exports为准.
把模块中的变量和方法导出
-
第一种方式,这种方式基本不用,存在全局变量污染
//模块 let a = 1; const fn = function () {}; //通过global全局对象导出 global.a = a; global.fn = fn;
-
第二种方式, 通过module.exports导出
//模块 let a = 1; const fn = function () {}; //通过module.exports module.exports = { a, fn }
如何引入一个模块
//模块1 暴露出去
let a = 1;
const fn = function () {};
//通过module.exports
module.exports = {
a,
fn
}
//模块2 引入模块1暴露出来的成员
const obj = require('模块1的路径'); //不需要通过path.join(__dirname + '模块1路径')方法拼接路径
console.log(obj); //{a: 1, fn: 函数}