一、Nodejs 基础

(一) 第一个 node 应用

  1. 新建 app.js,代码如下

var http = require('http');
http.createServer(function (request, response) {

    // 发送 HTTP 头部
    // HTTP 状态值: 200 : OK
    // 内容类型: text/plain
    response.writeHead(200, {
        'Content-Type': 'text/plain'
    });

    response.end('Hello World');
}).listen(8888);

// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');
  1. 启动服务

node app.js

(二) nodejs 的模块系统

1. nodejs模块系统介绍

一个js文件就是一个模块, 一个模块会有一些变量或者方法,可以导出这些变量或者方法提供给别的模块进行使用, 它也可以导入别的模块或者方法来使用

2. 导出模块和导入模块

// 例子1

// m1.js, 导出一个数组, 导出使用module.exports
module.exports = [1,2,3];

// index1.js 导入m1模块, 导入用 require(模块路径)
let list = require('./m1');
console.log(list);

// 运行index1.js
node index1.js

// 例子2

// m2.js 导出一个函数
function add(a,b) {
    return a+b;
}
module.exports = add;

// index2.js 导入m2模块
let add = require('./m2');
// 调用m2中的add方法
let sum = add(100, 200);
console.log('sum', sum);

// 运行 index2.js
node index2.js

// 例子3

// m3.js 导出一个对象
var username = '张三';
var age = 100;

function say() {
    console.log('我是' + username);
}

module.exports = {
    username: username,
    age: age,
    say: say
}

// index3.js 导入m3模块
let obj = require('./m3');
console.log('用户名', obj.username);
obj.say();

// 运行 index3.js
node index3.js

(三) 文件系统

  1. 读取文件

    // 例子1 异步读取文件内容
    // index1.js
    var fs = require("fs");
    
    console.log(1);
    // 异步读取
    fs.readFile('input.txt', function (err, data) {
        console.log(2);
        if (err) {
            return console.error(err);
        }
        console.log("异步读取: " + data.toString());
    });
    console.log(3);
    
    // 例子2 同步读取文件内容
    var fs = require('fs');
    // 同步读取
    var data = fs.readFileSync('input.txt');
    console.log("同步读取: " + data.toString());
    console.log("程序执行完毕。");
    
  2. 写入文件

    // 例子1 异步写入文件内容
    var fs = require("fs");
    
    console.log("准备写入文件");
    var str = '困难是我们的食物';
    
    fs.writeFile('data.txt', str, function (err) {
        if (err) {
            return console.error(err);
        }
        console.log('文件写入成功')
    });
    
    // 例子2 同步读取
    var fs = require("fs");
    var str = '困难是我们的食物';
    fs.writeFileSync2('data.txt', str);
    console.log('文件写入成功');
    
    // 添加trycatch可以捕捉写入过程中发生的错误
    try {
        fs.writeFileSync2('data.txt', str);
        console.log('文件写入成功');
    } catch (error) {
        console.log('错误信息', error);
    }
    

(四) nodejs原生路由

路由介绍: 路由字面意思是"途经", 路途经过什么地方的意思,没有两个地方的风景是一样, 所以你经过不同的地方, 看到的风景是不一样的,网站上的路由也类似这样的意思, 你访问不同的url, 那么你看到的东西也是不一样的。

// app.js nodejs原生路由简单例子
var http = require("http");
var fs = require("fs");
http
  .createServer((req, res) => {
    switch (req.url) {
      case "/hello":
        res.write("hello");
        res.end();
        break;
      case "/hehe":
        res.write("hehe");
        res.end();
        break;
      case "/my":
        fs.readFile("./dist/1.txt", (error, data) => {
          if (error) throw error;
          res.write(data);
          res.end();
        });
        break;
      default:
        res.write("this is home");
        res.end();
        break;
    }
  })
  .listen(3000, "localhost", () => {
    console.log("服务器运行在:http://localhost:3000");
  });
// 运行代码
node app.js

// 访问以下地址看看有什么不一样 
http://localhost:3000/hello
http://localhost:3000/hehe
http://localhost:3000/my
http://localhost:3000

(五) path模块

path模块介绍: nodejs自带的模块, 主要用来解决路径相关问题

  1. path.join(),因为window和linux系统分割符不一致,join可以解决这个问题
let path = require('path')
let str1 = path.join('/nodejs','dist');  
console.log(str1);  //  /nodejs/dist

let str2 = path.join('\\nodejs','dist');
console.log(str2);  //  /nodejs/dist
  1. path.resolve 把路径变成绝对路径
let path = require('path')
let str = path.resolvepath.resolve('nodejs','dist');  
console.log(str);  //  C:\Users\Administrator\Desktop\web04\nodejs\path\nodejs\dist
  1. __dirname 当前目录
let path = require('path');
console.log(__dirname);
// C:\Users\Administrator\Desktop\web04\nodejs\path
let str = path.resolve(__dirname,'dist');
C:\Users\Administrator\Desktop\web04\nodejs\path\dist

(六) npm&pnpm

(1) npm 工具

  1. npm 是什么

    • 前端通用的模块都存放在网站 https://www.npmjs.com/, 你需要用到nodejs模块在这个网站都能找到
    • npm 是 nodejs 模块 (一般称为包,一个模块就是一个包) 管理工具
  2. 初始化 package.json

    npm init   // 或
    npm init -y
    
    // package.json 版本号说明
    {
        "dependencies": {
            "foo": "1.0.0 - 2.9999.9999",   
            "bar": ">=1.0.2 <2.1.2", //必须大于等于1.0.2版本且小于2.1.2版本
            "baz": ">1.0.2 <=2.3.4", //必须大于1.0.2版本且小于等于2.3.4版本
            "boo": "2.3.1", //必须匹配这个版本
            "boo": "~2.3.1", //约等于2.3.1,只更新最小版本,相当于2.3.X,即>=2.3.1 <2.4.0
            "thr": "2.3.x",
            "boo": "^2.3.1", //与2.3.1版本兼容,相当于2.X.X, 即>=2.3.1 < 3.0.0,不改变大版本号。
            "qux": "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0",
             //在版本上指定一个压缩包的url,当执行npm install 时这个压缩包会被下载并安装到本地。
            "asd": "http://asdf.com/asdf.tar.gz", 
            "til": "~1.2",   
            "elf": "~1.2.3", 
            "two": "2.x",
            "lat": "latest",              安装最新版本
            "dyl": "file:../dyl",         使用本地路径
             // 使用git URL加commit-ish
            "adf": "git://github.com/user/project.git#commit-ish"    
        }
    } 
    
  3. 安装一个 nodejs 模块

    // 以jquery和axios为例   
    npm i jquery --save  /// 记录在 dependencies
    npm i axios --save-dev  //  记录devDependencies
    npm i serve -node    // 全局安装,serve是一个封装了nodejs服务的模块
    npm i // 当我们把node_modules删掉,使用npm i 可以把所有依赖都安装回来
    

    // dependency和devDependencies的区别

    (1) 使用 --save-dev 安装的 插件,被写入到 devDependencies 域里面去,而使用 --save 安装的插件,则是被写入到 dependencies 区块里面去。
    (2) 官方解释
    “dependency”:These packages are required by your application in production.(这些软件包是生产中的应用程序需要的)
    “devDependencies”: These packages are only needed for development and testing.(这些包仅用于开发和测试) 
    (3) package.json 文件里面的 devDependencies 和 dependencies 的区别
    devDependencies  里面的插件只用于开发环境,不用于生产环境,而dependencies是需要发布到生产环境的。比如我们写一个项目要依赖于jQuery,没有这个包的依赖运行就会报错,这时候就把这个依赖写入dependencies;而我们使用的一些构建工具比如glup、webpack这些只是在开发中使用的包,上线以后就和他们没关系了,所以将它写入devDependencies。
    
  4. 更新 nodejs 模块

    npm update xxx
    
    1. 删除 nodejs 模块

      npm uninstall xxx
      
    2. 运行指令 (运行package.json里script里的指令)

      npm run xxx
      

(2) pnpm工具

  1. 安装pnpm

    npm install -g pnpm@7
    

    pnpm兼容性

    以下是各版本 pnpm 与各版本 Node.js 之间的兼容性表格。

    Node.jspnpm 7pnpm 8pnpm 9
    Node.js 12
    Node.js 14✔️
    Node.js 16✔️✔️
    Node.js 18✔️✔️✔️
    Node.js 20✔️✔️✔️
  2. pnpm setup #自动设置环境变量

  3. pnpm config set global-bin-dir "D:\nodejs" # pnpm全局bin路径

  4. 安装模块pnpm add serve -g

  5. 查看源 pnpm get registry

  6. 设置源pnpm set registry https://registry.npmmirror.com

(七) 设置淘宝镜像

(1) 输入以下命令

npm config set registry https://registry.npm.taobao.org  

(2) 验证

npm config get registry

(3) 如果返回https://registry.npm.taobao.org,说明镜像配置成功。

(八) nodejs版本切换

  1. 下载安装 nvm

https://nvm.en.softonic.com/
  1. nvm命令

nvm                  // 会提示nvw下的相关命令
nvm ls               // 查看已安装node版本
nvm install 10      // 安装对应10.0版本的node
nvm uninstall 10    // 卸载对应10.0版本的node
nvm use xxx          // 选择使用XXX版本

(九) 服务器自动重启

  1. 全局安装nodemon
  2. 运行node app.js需要使用nodemon app.js来代替
  3. 示例: 新建app.js, 然后执行 nodemon app.js, 然后修改输出内容试试
var http = require('http');
http.createServer(function (request, response) {

    // 发送 HTTP 头部
    // HTTP 状态值: 200 : OK
    // 内容类型: text/plain
    response.writeHead(200, {
        'Content-Type': 'text/plain'
    });

    response.end('Hello World');
}).listen(8888);

// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');

(十) 调试代码

调试项目

参考链接: https://www.ruanyifeng.com/blog/2018/03/node-debugger.html

最简单的一种方法:

  1. 执行nodemon app.js时添加--inspect

    nodemon --inspect app.js
    
  2. 执行以上命令之后, 打开控制台, 左上角有个绿色的按钮, 点击它会弹出一个控制台

  3. 快捷键ctrl+p, 然后输入app.js, 接下来的事情就跟调试前端代码一样了

调试单个js文件

node --inspect-brk xxx.js

浏览器打开: chrome://inspect/#devices

点击 inspect按钮

(十一) nodejs版本切换

  1. 下载安装 nvm

https://nvm.en.softonic.com/
  1. nvm命令

nvm                  // 会提示nvw下的相关命令
nvm ls               // 查看已安装node版本
nvm install 10      // 安装对应10.0版本的node
nvm uninstall 10    // 卸载对应10.0版本的node
nvm use xxx          // 选择使用XXX版本
nvm alias default 10 // 默认nodejs版本号