Node.js学习笔记


引用参考2021了,真的不要再说 Node.js 是一门编程语言了

一、node.js概述

Node.js 不是一门编程语言,它是一个执行 JavaScript 代码的运行环境

1、node.js和浏览器

  • 因为浏览器和 Node.js 都内置了 JavaScript V8 Engine。所以他们都可以运行 JavaScript

  • 浏览器的JavaScript可以操作HTML和浏览器窗口(在JavaScript V8引擎中添加了控制他们的API,即BOM和DOM)

  • Node.js 中没有 DOM 和 BOM,但是添加了很多系统级别的 API,如对系统文件和文件夹的操作。获取操作系统信息,比如系统内存总量是多少,系统临时目录在哪

  • JavaScript 运行在浏览器中(即客户端 JavaScript),用于创建前端工程化工具。

  • JavaScript 运行在 Node.js 中(即服务器端 JavaScript),用于构建服务器端应用。

2、ES6,JavaScript,node.js区别

  • ECMAScript 6.0(简称 ES6)是 JavaScript 语言的标准(即语法规范),写javascript和nodejs都必须遵守。如:变量定义,循环、判断、函数、原型和原型链、作用域和闭包、异步。
    不能操作DOM,不能监听click事件,不能发送ajax请求,不能处理http请求,不能操作文件。即,只有ECMAScript ,几乎做不了任何实际的项目

  • JavaScript:ECMAScript语法规范++Web API。可以进行DOM操作,BOM操作,事件绑定,Ajax等(浏览器端的任何操作)

  • node.js: ECMAScript语法规范++nodejs API。如:处理http ,处理文件等(完成server端的任何操作)

3、模块系统

在 Node.js 环境中,默认就支持模块系统,该模块系统遵循 CommonJS 规范。

  • __filename:当前模块文件名称。

  • __dirname:当前文件所在路径。

3.1、Node.js 内置模块
  • Path:模块内提供了一些和路径操作相关的方法。
const path = require("path")
console.log(path.parse(__filename))

{
   
  root: '/',
  dir: '/Users/administrators/Desktop/node_test',
  base: 'app.js',
  ext: '.js',
  name: 'app'
}
  • File system:文件操作系统,提供了和操作文件相关的方法。
const fs = require("fs")

const files = fs.readdirSync("./")
console.log(files)  [ 'app.js', 'logger.js' ]

fs.readdir("./", function (error, files) {
   
  console.log(error) // null | Error {}
  console.log(files) // [ 'app.js', 'logger.js' ] | undefined
})
  • 在引入内置模块时, 使用的是模块的名字,前面不需要加任何路径。

4、npm

Node.js 软件包都是基于Node.js平台开发的,这些软件包都被托管在 www.npmjs.com 中,通过npm来管理

npm随node.js一起安装,和node是两个独立的应用程序(可以通过版本号证明)

4.1、package.json
  • Node.js 规定在每一个软件包(或工程项目)都必须包含一个叫做 package.json 的文件

  • 它是应用程序的描述文件,包含和应用程序相关的信息,比如应用名称,应用版本,应用作者等等。

  • 通过 package.json 文件可以方便管理应用和发布应用。

  • 创建 package.json 文件: npm init

  • 快速创建 package.json 文件: npm init --yes

{
   
  "name": "project-name",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
   
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
4.2、下载 Node.js 软件包

在应用程序的根目录执行命令:npm install < pkg > 或者 npm i < pkg >

软件包下载完成后会发生三件事:

  • 软件包会被存储在 node_modules 文件夹中,如果在应用中不存在此文件夹,npm 会自动创建。

  • 软件包会被记录在 package.json 文件中. 包含软件包的名字以及版本号。

  • npm 会在应用中创建 package-lock.json 文件, 用于记录软件包及软件包的依赖包的下载地址及版本。

4.3、node_modules

node_modules 文件夹中的软件包不需要提交到 git 仓库中,因为文件夹较大,可达到几百兆。

  • 在 package.json 文件中都会记录项目都依赖了哪些包,在package-lock.json 查看对应包的版本

  • 可以通过 npm install 命令重新下载它们

将应用程序提交到版本库之前,切记将 node_modules 文件夹添加到 .gitignore 文件中,这样就不会连同node_modules一块上传。

git init
git status
echo "node_modules/" > .gitignore
git status
git add .
git commit -m "our first commit"
4.4、删除和更新软件包
npm uninstall <pkg>
npm un <pkg>

npm outdated ,可以查看哪些软件包已经过期,对应的新版本是什么。
npm update ,更新过期的软件包,更新操作遵循语义版本控制规则。
4.5、项目依赖和开发依赖

在 package.json 文件中, 项目依赖和开发依赖要分别记录

  • 项目依赖被记录在 dependencies 对象中
  • 开发依赖被记录在 devDependencies 中
  • 使开发者可以在不同的环境中下载不同的依赖软件包。
下载开发依赖,在命令后加上 --save-dev 或者 -D。如:npm i eslint -D
4.6、本地安装和全局安装

本地安装:将软件包下载到应用根目录下的 node_modules 文件夹中,软件包只能在当前应用中使用

全局安装:将软件包下载到操作系统的指定目录中,可以在任何应用中使用

  • 通过 -g 选项将软件包安装到全局:npm install < pkg > -g
4.7、设置或更改npm镜像地址

由于 npmjs.com 是国外的网站,大多数时候下载软件包的速度会比较慢

更改 npm 镜像地址

npm config set registry https://registry.npm.taobao.org
npm config set registry https://registry.npmjs.org/
cat .npmrc
4.8、npx命令

npx 是 npm 软件包提供的命令,它是 Node.js 平台下软件包执行器。主要用途有两个:

  • 第一个是临时安装软件包执行后删除它

有些提供命令的软件包使用的频率并不高,比如 create-react-app 脚手架工具,我能不能临时下载使用,然后再删掉它。

npx create-react-app react-test
  • 第二个是执行本地安装的提供命令的软件包

现在有两个项目都依赖了某个命令工具软件包,但是项目 A 依赖的是它的 1 版本,项目 B 依赖的是它的 2 版本,我在全局到底应该安装什么版本呢 ?

该软件包可以在本地进行安装,在 A 项目中安装它的 1 版本, 在 B 项目中安装它的 2 版本,在应用中可以通过 npx 调用 node_modules 文件夹中安装的命令工具。

  • 总结:将所有软件包安装到应用本地是现在最推荐的做法,一是可以防止软件包的版本冲突问题,二是其他开发者在恢复应用依赖时可以恢复全部依赖,因为软件包安装到本地后会被 package.json 文件记录,其他开发者在运行项目时不会因为缺少依赖而报错

二、server端介绍

1、服务稳定性

  • server端可能会遭受各种恶意攻击和误操作
  • 单个客户端可以意外挂掉,但是服务端不能
  • 使用PM2做进程守候(当服务一旦挂掉,会自动重启)

2、考虑CPU 和内存(优化、扩展)

  • 客户端独占一个浏览器,内存和CPU都不是问题
  • server端要承载很多请求,CPU和内存都是稀缺资源
  • 使用stream 写日志,使用redis存session

3、日志记录

  • 前端也会参与写日志,但只是日志的发起方,不关心后续
  • server端要记录日志、存储日志、分析日志,前端不关心
  • 多种日志记录方式,以及如何分析日志

4、安全

  • server端要随时准备接收各种恶意攻击,前端则少很多
  • 如︰越权操作,数据库攻击等
  • 登录验证,预防xss攻击和sql注入

5、集群和服务拆分

  • 产品发展速度快,流量可能会迅速增加
  • 如何通过扩展机器和服务拆分来承载大流量?
  • 本课程在设计上支持服务拆分

三、node简单demo实战

一、项目介绍

1、需求

首页,作者主页,博客详情页
登录页
管理中心,新建页,编辑页
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、技术方案

数据如何存储

  • 博客数据
  • 用户数据

如何与前端对接,即接口设计
在这里插入图片描述

二、开发博客项目之接口

1、开发接口(不用express、koa)

  • nodejs处理http请求
  • 搭建开发环境
  • 开发接口(暂不连接数据库,暂不考虑登录)

2、处理get请求

  • 先在项目路径下运行npm init -y,初始化,生成一个package.json文件
  • 将package.json里,改为"main": “app.js”, 并新建一个app.js文件
const http = require('http');
const querystring = require('querystring');

const server = http.createServer((req,res) => {
   
    console.log('method',req.method);
    const url = req.url;
    console.log('url',req.url);
    req.query = querystring.parse(url.split('?')[1]);
    let routerPath = url.split('?')[0];//返回路由
    console.log('query', req.query);
    res.end(
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值