• Node的模块化管理


    ES6的模块管理规范:module

    导出/导入 export/export default  / import from

    一、Node的模块化管理

    1、模块化:node应用程序由模块组成,遵循的是CommonJS模块规范 使用模块管理的好处是隔离模块的作用域,避免出现命名冲突。

    2、CommonJS:是一套代码的规范,构建一个在浏览器之外的JavaScript语言的生态系统

    3、CommonJS规范的主要内容

    (1)通过module.export导出对外的变量或接口

    (2)通过require将其他模块导入到当前模块的作用域中

    4、CommonJS的特点:

    (1)所有模块都运行在当前模块的作用域中,不会污染全局作用域

    (2)模块是同步加载,根据文件中模块出现的顺序依次加载

    (3)模块可以多次加载,但只有在第一次加载时运行,其他的加载会放入缓存中,后续加载会直接从缓存中读取

    二、Node的module对象

    1、在node内部定义了一个module构造函数,构造函数的属性有:

    (1)id:表示模块的标识符

    (2)parent:表示调用该模块的模块

    (3)exports:表示导出的值

    (4)paths:表示模块的查找路径。当前目录的node_modules——父目录的node_modules——>...——>根目录下的node_modules

    (5)path:表示当前模块所在的路径

    (6)filename:当前模块的所在文件名

    注:在CommonJS规范中所有的模块都是Module的实例(对象)

    2、exports变量:该变量指向module.exports,作用:方便用户的操作

    1. exports.area = function(r){
    2. return Math.PI * r**2
    3. }

    注:不能直接给exports赋值,这样就切断了exports与module.exports之间的关系,无法导出

    三、require命令:是node的内置命令,主要用于加载模块文件

    1、作用:导入并执行JavaScript文件,返回的是exports对象

    2、加载规则

    (1)加载文件的默认后缀名是:.js

    (2)如果参数字符串为'/'开头,表示加载的文件是一个位于绝对路径下的模块文件。

    (3)如果参数字符串为'./'开头,表示加载的文件是一个位于相对路径下的模块文件

    (4)如果参数字符串不以'./'或'/'开头,则表示加载的是一个默认提供的核心模块(位于Node的系统安装目录中),或各级node_modules目录的已安装模块(全局安装或局部安装)

    四、Buffer对象

    1、作用:是Node提供的处理二进制数据的对象(接口),是node的内置对象,在使用时不需要安装,可直接导入使用,不需要require('buffer')

    2、使用原因:JavaScript处理字符串的功能非常强大,但在二进制数据处理方面能力较弱,因此node就内置了buffer对象专门处理二进制数据。Buffer是一个构造函数。可以使用new创建Buffer的实例对象,浏览器的V8引擎会为Buffer的对象分配内存空间,类似于数组

    1. let buf = new Buffer(256); //256表示buf有256个单元 ,类似于数组,下标的范围在0~255之间
    2. console.log(buf);
    3. //注:buf的每个单元存放的数据必须是0~255之间的整数值,即buf的每个单元就是一个字节

    3、Buffer对象可以和字符串进行互换

    五、Buffer构造函数

    1、给构造函数传递整数:表示分配多少个字节的存储空寂

    let bytes = new Buffer(5); //表示给bytes分配5个字节的存储空间

    2、给构造函数传递数组:数组的成员必须是整数值

    let bytes = new Buffer([0x10,0x48]);//表示将数组传递给Buffer构造函数

    3、给构造函数传递字符串:默认的编码格式是utf8

    1. let b1 = new Buffer('今天周三~','utf8');
    2. console.log(b1.toString());

    六、Buffer常用的函数

    1、Buffer.isEncoding(字符集):参数’字符集‘表示字符的编码格式(ASCII、utf8、base64)。作用是判断Buffer的字符集是否是给定的字符集,如果是函数返回true,否则返回false。

    2、Buffer.isBuffer(对象):参数是一个对象,判断该参数是否是一个Buffer的实例。

    3、Buffer.byteLength(buffer):返回字符串实际占有字节长度

    七、Buffer实例属性

    1、length:表示Buffer对象的长度(单元个数)

    八、Buffer实例方法

    1、类的成员:

    (1)实例成员

    (2)类成员:静态成员。是通过类名直接访问,不属于某个具体的对象,而是类的所有对象共享

    1. class Student{
    2. constructor(id,name){
    3. Student.school = '北京大学', //类成员(静态成员)
    4. this.id = id, //实例成员
    5. this.name = name //实例成员
    6. }
    7. Student.setSchool = function(){ //类方法
    8. }
    9. show(){ //实例方法
    10. }
    11. }
    12. let stu1 = new Student(001,'小王'); //stu1有自己的id和name
    13. let stu2 = new Student(002,'小张');

    2、Buffer的实例方法

    1、write(value,index):向Buffer对象中写入数据

    参数value:表示写入的值     参数index:表示写入的位置,可省略

    使用Buffer时注意的问题:在创建Buffer对象时,node建议使用以下两个方法,而不建议使用new:

    (1)Buffer.alloc(number,fill,encoding):返回一个Buffer对象

            参数number必须是整数,代表buffer的单元个数   

            参数fill:表示填充数据,默认值为0

            参数encoding:若填充数据是字符串,用来指定字符串的格式,默认为utf8

    (2)Buffer.from(args1,args2):返回一个Buffer对象

            参数args1:可以是字符串,也可以是数组

            参数args2:若第一个参数为字符串,则用来指定字符集,若为数组,则该参数省略。

    1. let b1 = Buffer.from('abc');//字符串作为参数
    2. console.log(b1)
    3. let b2 = Buffer.from([0x41,0x42,0x43]);//数组作为参数
    4. console.log(b2.toString());

    九、Node的文件操作

    对文件的I/O操作使用的是fs(FileSystem)模块

    I/O操作是输入/输出操作(i表示Input,o表示Output)

    1、使用方法:使用require导入

    var fs = require('fs')

    2、读文件

    (1)异步读文件 —— 非阻塞方式的读

            readFile(filename,callback)

            参数filename:表示文件的全名

            参数callback:回调函数。读文件结束后执行该函数

    1. fs.readFile('../input.txt',function(err,data){//参数err存放的是读文件出现错误的信息,data存放的是读取的文件内容
    2. if(err){
    3. return console.error(err);
    4. }
    5. console.log('文件内容为:',data.toString())
    6. })
    7. console.log('程序结束~')

    (2)同步读文件 —— 阻塞方式的读

            readFileSync(filename,encoding):函数的返回值就是文件的内容

            参数filename:表示文件的全名

            参数encoding:表示字符集

    1. let data = fs.readFileSync('../input.txt');
    2. console.log(data.toString());
    3. console.log('程序结束~')

    3、打开文件

    open(path,flags[,mode],callback)

    path:要打开的文件路径

    flags:打开文件的方式

            r:以只读的方式打开文件,若文件不存在则报错

            r+:打开文件后可以读、写

            w:以写入的方式打开文件。若打开的文件不存在,则创建文件

            w+:打开文件进行读和写。若打开的文件不存在,则创建文件

            a:打开文件进行追加(在文件原有内容的末尾追加新内容)

    1. fs.open('input.txt','w',function(err,fd){
    2. if(err){
    3. return console.error(err);
    4. }
    5. console.log('文件打开成功~',fd)
    6. })
    7. console.log('程序结束~')

    4、区分文件和目录的方法

    fs.stat(path,callback)

            path:路径名

            callback(err,stats):回调函数

            err:表示打开文件发生错误时的信息

            stats:表示当前文件的状态

    1. fs.stat('../input.txt',function(err,stats){
    2. if(err){        
    3. return console.error(err);  
    4. }    
    5. console.log('是目录?',stats.isDirectory());
    6. console.log('是文件?',stats.isFile());
    7. })

    5、写文件:向文件中写入内容

    (1)writeFile(filename,data[,options],callback) —— 异步写。若文件存在则覆盖

    1. fs.writeFile('../input.txt','大后天就放假~',function(err){
    2. if(err){
    3. return console.error(err);
    4. }
    5. console.log('文件写入成功~');
    6. })
    7. console.log('程序结束~');
  • 相关阅读:
    没有基础适合学习java吗?
    网上商城购物系统设计与实现(Java+Web+SSM+MySQL)
    MySQL 8.0 Undo Tablespace管理
    Golang远程调试Debug环境
    JVM及GC
    「iOS」UI——无限轮播图实现与UIPageControl运用
    目的:ubuntu下编译GLFW库
    深入React源码揭开渲染更新流程的面纱
    在WordPress网站上添加文章分类信息
    react管理系统layOut简单搭建
  • 原文地址:https://blog.csdn.net/m0_73634593/article/details/127895407