Node.js——2

访问核心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规范

  1. 是一套js的模块化规范,规定了模块的特性和各模块之间如何相互依赖.
  2. 一个js文件就是一个模块
  3. require() 导入其它模块,它是同步的 require查找规则
  4. module.exports 暴露一个模块
  5. 同步加载,不适用于浏览器端

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为准.

把模块中的变量和方法导出

  1. 第一种方式,这种方式基本不用,存在全局变量污染

     //模块
     let a = 1;
     const fn = function () {};
     //通过global全局对象导出
     global.a = a;
     global.fn = fn;
    
  2. 第二种方式, 通过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: 函数}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值