node.js

224 阅读8分钟

nodejs

一.nodejs简介 p3

nodejs是一个能够在服务器运行的js开放源代码

node是单线程的

p4 使用node执行js

p5 模块化简介

commonjs规范 :希望js在任何地方运行

es(es6前)缺陷:没有模块化 什么是模块? 一个js就是一个模块


reqire( **"path")//如果使用相对路径 必须用.. 或.开头
reqire( "./xxx/xxx.js")
let obj= reqire( "./xxx/xxx.js")

p7 模块化详解

核心模块 -直接写名字

文件模块 -写地址(路径)

在node中有一个全局对象global 类似网页的window对象

P8 exports 和module.exprots 区别

module.exprots可以导出对象

本质是相同的 exports只能通过.的形式暴露

module . exprots 能通过.的形式暴露 也能直接赋值

为什么exports只能通过 . 的形式暴露? 可以想成exports=module.exprots 但是 把exports={}时 把exports的地址改变了 exports不指向module.exprots 的地址 所以exports只能通过.的形式暴露

P9 包的简介

commonjs规范 由包结构 (1 package.jsonc 2 bin 3 doc 4 test ) 包描述文件组成:package.json bin

注意 任何json文件都不能写注释

package.json是一个项目描述文件, 里面记录了当前项目的信息。eg: 项目名称、版本、作者、[gitHub]
(https://so.csdn.net/so/search?q=gitHub&spm=1001.2101.3001.7020)地址、当前项目依赖哪些第三方
模块等。 使用npm安装第三方模块,是模块的相关信息会自动添加到package.json文件中


{
  // 项目名称
  "name": "kr-ui-platform",
  // 项目版本
  "version": "0.1.0",
  // 由此设置,那么 npm将拒绝发布它,这是一种防止意外发布私有存储库的方法
  "private": true,
  // 项目描述,description是一个字符串。它可以帮助人们在使用npm search时找到这个包
  "description": '',
  //项目的主入口文件,在模块化项目中都会有一个主模块,main 里面填写的就是主模块的入口文件
  "main": "index.js",
  //定义命令别名,当命令很长时可以使用别名替换
  //使用方法:npm run 别名
  // scripts中配置可以 以键值对(key:value)的形式来取“别名”
 "scripts": {
    "start": "node index.js",
    "server": "nodemon index.js --ignore client",
    // 此项目运行命令: npm run serve
    // 有的项目运行命令为: npm run dev(看各个项目的实际情况)
    "serve": "vue-cli-service serve --mode development",
    // 开发环境
    "dev": "vue-cli-service build --mode dev",
    // sit环境
    "sit": "vue-cli-service build --mode sit",
    // uat环境
    "uat": "vue-cli-service build --mode uat",
    // 打包别名 【 
    // 打包prod_zz_test的命令: npm run prod_zz_test
    "prod_rj": "vue-cli-service build --mode prod_rj",
    "prod_rj_clinical": "vue-cli-service build --mode prod_rj_clinical",
    "prod_zz": "vue-cli-service build --mode prod_zz",
    "prod_zz_test": "vue-cli-service build --mode prod_zz_test",
    "test": "vue-cli-service build --mode test",
    // 】
    "lint": "vue-cli-service lint",
    "test:e2e": "vue-cli-service test:e2e",
    "test:unit": "vue-cli-service test:unit",
    "analyzer": "cross-env use_analyzer=true npm run serve"
  },
  // 关键字,允许我们使用关键字去描述当前项目
  "keywords": [],
  //项目的作者
  "author": "",
  //项目遵循的协议,默认是ISC也就是开放源代码的协议
  "license": "ISC",
   //开发 依赖所需要的第三方模块(包)
  "devDependencies": {
    "gulp": "^3.9.1"
  }
  

项目依赖

在项目的开发阶段和线上运营阶段,都需要依赖的第三方包,称为项目依赖;
使用npm install 包名命令下载的文件会默认被添加到 package.json 文件的 dependencies 字段中;

//项目 依赖所需要的第三方模块(包)
  {
    "dependencies": {
        "jquery": "^3.3.1“
    }
 }

开发依赖

在项目的开发阶段需要依赖,线上运营阶段不需要依赖的第三方包,称为开发依赖;
使用npm install 包名 --save-dev命令将包添加到package.json文件的devDependencies字段中,以此来区分项目依赖;

 {
    "devDependencies": {
        "gulp": "^3.9.1“
    }
 } 

P10 npm简介

NPM (node package manager)

帮助第三方模块发布,安装和依赖

npm命令

1、npm -v : 查看npm版本。

2、npm init : 初始化后会出现一个package.json配置文件。可以在后面加上 -y , 快速跳过问答式界面。

3、npm install : 会根据项目中的package.json文件自动下载项目所需的全部依赖。

4、npm install 包名 --save-dev(npm install 包名 -D) :安装的包只用于开发环境,不用于生产环境,会出现在package.json文件中的dependencies属性中。

5、npm install 包名 --save(npm install 包名 -S):安装的包需要发布到生产环境的,会出现在package.json文件中的dependencies属性中。

6、npm list : 查看当前目录下已安装的node包。

7、npm list -g : 查看全局已经安装过的node包。

8、npm --help : 查看npm帮助命令。

9、npm update 包名 :更新指定包。

10、npm uninstall 包名 :卸载指定包。

11、npm config list :查看配置信息。

12、npm 指定命令 --help : 查看指定命令的帮助。

13、npm info 指定包名 :查看远程npm上指定包的所有版本信息。

14、npm config set registry registry.npm.taobao.org : 修改包下载源,此例修改为淘宝镜像。

15、npm root :查看当前包的安装路径。

16、npm root -g :查看全局的包的安装路径。

17、npm ls 包名 :查看本地安装的指定包及版本信息,没有显示empty。

18、npm ls 包名 -g :查看全局安装的指定包及版本信息,没有显示empty。

19、npm install 包名 -g 全局安装

P11 配置cnpm

npm install -g cnpm --registry=https://registry.npm.taobao.org

P12 node搜索包流程

通过npm下载的包都放在node_nodules文件夹中,直接通过包名引入即可
var math = require('math')
node在使用模块名字(非路径)来引入模块时,它会首相在当前目录的node_modules中寻找是否含有该模块
如果有则直接使用
如果没有则去上一级目录的node_modules中寻找,
如果有则直接使用,如果没有则再去上一级目录的node_modules中寻找,
直到找到磁盘根目录

P13 Buffer缓冲区

P14 fs模块

文件的同步写入

​ 所有的文件写入 如果说写入的文件不存在 那么会自动创建文件

​ 文件写入 就是将我们数据写入到文件中 一下的三种方法也是一样的 所以说 都是写入

​ 一般情况下 我们文件写入分为三步组成 同步写入最醒目 最清晰

​ 其实写入文件就是将数据存到文件中 一共分为三步

​ 第一 打开文件 第二 把数据放到文件中 第三 关闭文件

​ 一共涉及到三个方法

​ 1.openSync : 打开文件

​ 内置三个参数

​ 第一个参数是打开的文件路径

​ 第二个参数是打开方式

​ 文件的打开方式有三种

​ r : 只读方式打开

​ w : 写入方式打开 覆盖写

​ a : 写入方式打开 追加写

​ 第三个参数是打开权限 这个参数一般不传

​ 返回值是资源句柄

​ 2.writeSync : 写入文件

​ 内置四个参数

​ 第一个参数是资源句柄

​ 第二个参数是写入的数据

​ 第三个参数是字符集 写入的字符集

​ 第四个参数是写入的起始位置 但是 我们一般不传

​ 3.closeSync : 关闭文件

​ 内置一个参数 参数是资源句柄


const fs = require('fs');

// 打开文件
/*
1.openSync  :  打开文件
    内置三个参数
        第一个参数是打开的文件路径
        第二个参数是打开方式
            文件的打开方式有三种
                r  :  只读方式打开
                w  :  写入方式打开   覆盖写
                a  : 写入方式打开  追加写
        第三个参数是打开权限  这个参数一般不传
    返回值是资源句柄
*/
// let fd = fs.openSync('../test/3.sync.txt', 'w');
let fd = fs.openSync('../test/3.sync.txt', 'a');

// 定义写入到文件的字符串
// let str = "五花马  千金裘  呼儿将出换美酒  与尔同销万古愁";
let str = "五花马  千金裘  呼儿将出换美酒  与尔同销万古愁\n";

// 写入文件
/*
2.writeSync  :  写入文件
    内置四个参数
        第一个参数是资源句柄
        第二个参数是写入的数据
        第三个参数是字符集  写入的字符集
        第四个参数是写入的起始位置  但是  我们一般不穿

*/
fs.writeSync(fd, str, 'utf-8');

// 关闭文件
/*
3.closeSync  :  关闭文件
    内置一个参数  参数是资源句柄
*/
fs.closeSync(fd);

P15异步文件写入

异步文件写入

``js fs.open(path,flags[,model],callback)`

      -用来打开一个文件

      -异步调用的方法,结果都是通过回调函数返回的

      -回调函数两个参数:

         err 错误对象

         fd  文件的描述符

fs.write(fd,string[,position[,encoding]],callback)

   -用来异步写入一个文件

fs.close(fd,callback)

    -用来关闭文件

uTools_1650531163111.png

p16 简单文件写入

有同步和异步两种

    fs.writeFile(file,data[,options],callback)
    fs.writeFileSync(file,data[,options])

file 要操作文件的路径
data 要写入的数据
options 选项
callback 写入完成后执行的参数\

P17 流式文件写入

同步、异步、简单文件的写入都不适合大文件的写入,性能较差,容易导致内存的溢出
fs. createWriteStream (path[, options])

var fs=require("fs") ;

//流式文件写入
//创建一个可写流

var ws = fs.createWriteStream("he11o3. txt") ;

//通过监听流的open和close事件来监听流的打开和关闭
ws.once("open",function(){
    console.log("流打开了");
});
ws.once("close",function(){
    console.log("流关闭了");
});

//通过ws向文件中输出内容,可多次写入
ws.write ("通过可写流写入文件的内容");
ws.write ("网易云移动端播放器"); 
ws.write ("网络服务与最终用户的一个接口");
ws.write ("建立、管理、终止会话");
ws.write ("通过可写流写入文件的内容");

//关闭流
ws.end();

1.ws.once监听open,由于open是一次性的事件,没有必要用on

​ on(事件字符串,回调函数)

​ 可以为对象绑定一个事件,

​ once(事件字符串,回调函数)

​ 可以为对象绑定一个一次性事件,改时间将会在触发一次后自动失效

P18 简单文件的读取

异步 fs.readFile(路径,{配置信息json},回调函数(err对象,data数据为Buffer)) 在回调函数中data.toString()获取文件内容,或者配置读取时为'utf-8' 同步 fs.readFileSync(路径,{配置信息json})