网站基本组织架构
1、在讲后端语言之前,我们简单的了解一下我们基本的组织架构
2、我们是一个 前端开发工程师
3、还有一个工作叫做 后端开发工程师
4、我们一个网站的组织架构基本上由下面的步骤完成
5、用户 => 前端 => 后端 => 数据库
6、整个过程中
-
用户向前端人员要一个网页
-
前端人员准备一个网页给用户,但是网页中的数据是找后端人员要的
-
后端人员接受到前端人员要数据以后,去数据库里面找到对应的数据,给到前端人员
-
前端人员拿到数据以后渲染在页面上
-
最后把这个页面给到用户看
7、比如: 我们浏览一个新闻网站
-
用户输入网址
-
前端人员就要把对应的页面给到用户,在页面打开的过程中,想后端人员索要新闻信息
-
后端人员接收到前端人员索要新闻信息以后,就去数据库中找到对应的新闻信息数据给前端人员
-
前端人员接收到后端人员给的新闻信息以后,使用我们的办法吧新闻信息数据渲染在页面上
-
页面就打开了,用户就可以看到一个新闻网站了
-
比如: 用户登陆一个网站
-
当用户书写完表单内容以后,点击提交按钮的时候
-
前端人员拿到用户填写的内容,把数据整合好传送给后端人员
-
后端人员接收到数据以后,去数据库中进行比对,看看有没有对应的数据
-
然后告诉前端人员,你给我的用户名和密码是否正确
-
前端吧信息反馈给客户看到
-
如果正确就是跳转页面
-
如果不正确提示用户名或者密码有问题
-
-
服务器的简单理解
我们不可能把数据库丢在用户的电脑上,一个是太大,一个是不安全,所以我们要把数据库放在网络的另一端(远程),所以当前端人员向后端人员索要数据的时候需要网络,我们也不可能把页面也放在用户的电脑上。所以用户也是需要网络来向前端人员所有页面
到底什么是服务器
- 其实说白了,服务器就是一个电脑,当他跑起来一些程序的时候,就变成了一个服务器
- 只不过会跑一些特殊的程序,需要一些特殊的环境
- 换句话说,我们自己的电脑,跑一些特殊的程序的时候,也可以当作一个小型的服务器来用
- 只不过计算能力/存储能力/转存能力没有专业的服务器电脑厉害而已
服务器是怎么访问的呢
- 涉及到我们的
url
地址中的一些内容了 - 比如我们的经常访问的
www.baidu.com
https://www.baidu.com/ - 这个里面就包含很多的内容,我们看到的这个只是一个省略后的内容
- 是浏览器帮我们省略掉了一些内容
- 全部的地址应该是
https://www.baidu.com:443
- 发现多了两个东西
https://
和:443
- 其实一个简单的
url
地址是由三部分组成的- 传输协议
- 域名
- 端口号
传输协议
- 我们常见的传输协议是
http
和https
- 他们是限制用户和服务器之间交流传输数据的方式和规则
- 也是我们前端和后端人员交互的规则
- 规则
- 建立连接通道
- 相互通信
- 关闭连接通道
- 只不过
http
是一种常见协议,不是很安全 https
是一种加密传输协议
域名
- 之前我们说过,服务器就是一个在 网络那一头 的一个电脑
- 以前,没有域名的概念,大家都是使用
IP
地址来访问 - 也就是 网络那一头 的那个电脑的
IP
- 都是一堆数字,不方便记忆
- 后来就有了一个 万维网,他把每一个 IP 地址配套了一个英文的名字
- 方便用户记忆
- 所以说,域名就代表着 网络那一头 那个电脑的 IP 地址
- 其实也就是我们要访问哪一个服务器
- 服务器只认识唯一的ip地址,它是不认识域名的?DNS域名解析器
端口号
- 人家的服务器电脑也是有很多的文件夹的
- 不同的文件夹里面存储着不同的内容
- 可能有个 a 文件夹,里面存储的是首页
- 可能有个 b 文件夹,里面存储的是一些数据
- 所以说,你光找到服务器电脑还不行,还得找对文件夹才可以
- 大家都把文件夹编上号存储了
0 ~ 255
一共 256 个 - 每个文件夹里面还有对应的小文件夹
0 ~ 255
一个 256 个 - 那么一共就有
256 * 256
个文件夹,也就是从0 ~ 65535
- 所以我们的端口号就有
65536
个,分别对应着0 ~ 65535
- 大家都把
80
端口号作为一个网站的默认端口号 - http 协议默认是 80 端口号
- https 协议默认是 443 端口号
百度
- 到现在,我们在看百度的完整 url 地址
https://www.baidu.com:443
- 以一种加密传输协议来通讯
- 访问的是网络上
IP
的值为119.75.217.109
的那个电脑 - 访问的是第
443
号文件夹
- 这个文件夹里面存储着一个百度的页面
- 我们就能看到这个页面了
服务器软件
使计算机具备提供某种服务能力的应用软件,称为服务器软件,
通过安装相应的服务软件,然后进行配置后就可以使计算具备了提供某种服务的能力。
常见服务器分类: 文件服务器、数据库服务器、邮件服务器、Web服务器等
;
其中与我们息息相关的是 web服务器, 想让计算机成为 web 服务器, 就要安装服务器软件, 提供 web 服务
常见的提供web服务的服务器软件
- (1) IIS windows web 服务器软件
- (2) apache web 服务器软件 ( 开源免费的 )
- (3) Tomact
- (4) Nginx
node
- node官网
- node中文网
- 什么是 node
- Node.js is a JavaScript runtime built on Chrome’s V8 JavaScript engine.
- Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
- 这个是 node 官网的解释
- 其实 node 就是用 javascript 语言写 后端
- 也就是说,我们的 javascript 有了 node 以后,不光是一个前端语言,也是一个后端语言
- 前端 javascript
- 三大核心
- ECMAScript
- DOM
- BOM
- 操作内容
- 浏览器
- 解决兼容问题
- 三大核心
- 后端 javascript (node)
- 核心
- ECMAScript
- 操作内容
- 后端代码
- 数据库
- 核心
- 也就是说,node 我们不需要解决兼容问题,不需要 DOM 和 BOM,只关注业务逻辑就可以了
下载 node 安装包
NVM node版本管理器
-
我们的电脑是没有自带 node 环境的
-
需要我们手动下载一个 node 安装包,安装 node 环境
-
有了 node 环境以后,我们就可以运行 node 了
-
下载方式
- 注意: 在 node 中文网下载的时候,选择安装包,不要选择 二进制文件
- 因为 二进制文件 是一个简单版,我们需要自己配置 环境变量 才可以使用
安装 node 环境
- 下载好以后,我们直接把下载好的文件双击运行就行
- 找到
node-v10.16.2-x64.msi
对应的文件
- 这个时候 node 就安装完毕了
检测安装环境
-
检测安装是否成功
-
我们打开运行窗口 (win + r)
-
就是我们键盘下面那个 windows 的窗口键 + r 键
-
-
写入 cmd 然后按下回车,来到我们的命令行
-
然后再命令行写入一个指令
$ node -v
-
然后按下回车,会得到一个 node 的版本号
-
能看到版本号表示 node 环境安装成功
- 至此,我们的 node 环境就有了
- 我们就可以再电脑里面运行我们的 node 了
node 初体验
- 到现在,我们的 node 环境已经安装完毕了
- 接下来我们就体验一下 node
- 我们的 node 到底是一个什么东西
- 就是直接在 终端(命令行) 中运行
js
代码 - 也可以用
.js
文件写一堆js
代码 - 然后不需要浏览器,直接让我们写的
js
代码运行在我们自己电脑的终端上
- 就是直接在 终端(命令行) 中运行
直接在终端中书写 js 代码
-
打开命令行
-
书写指令
$ node
-
直接按下回车,会看到 光标在闪烁,我们就进入了 node 代码编写环境
-
直接书写代码就可以了
在命令行运行一个 js 文件
-
先新建一个文件夹
-
在里面写一个 js 文件
- 我这里默认在
桌面/demo文件夹/idnex.js
- 我这里默认在
-
在文件里面写一些 js 代码
// index.js console.log('hello node')
-
打开命令行,要让命令行的路径和你存放这个要执行的 js 文件的目录一致
-
切换好以后,我们直接使用指令来运行我们准备好的 js 文件
$ node index.js
-
然后就会在命令行把我们刚才写的 js 文件运行了
-
就会在控制台输出
hello node
- 现在我们就已经运行了一段 js 代码在命令行了
- 这也就解释了一下最开始官网说的那句话
- Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
- 我们的 node 安装完毕以后,就在命令行提供了一个基于 Chrome V8 引擎的运行环境
- 在这个环境中运行 javascript 代码
- 这个就是 node.js
- Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
常用的 DOS(磁盘系统) 操作
- 其实就是在命令行使用指令来操作我们的电脑
- 因为我们的 node 就是在命令行运行 js
- 所以我们要了解一些常用的命令行指令
目录操作
-
目录操作就是操作我们的命令行路径
-
查看当前目录下所有文件
$ dir
-
以树状结构展示当前目录下的所有文件及子目录下的所有文件
$ tree
-
进入当前目录下的某一个目录
$ cd 文件夹名称
-
返回上一级目录
$ cd ..
-
切换盘符
$ 盘符: $ d:
-
文件操作
-
文件操作就是通过指令创建文件或者文件夹
-
创建文件夹
# 表示在当前目录下创建一个叫做 test 的文件夹 $ md test
-
移除文件夹
# 表示移除当前文件夹下的 test 文件夹 $ rd test
-
复制文件夹
# 表示复制一份 test 文件夹起名为 test2 不能复制一个空文件夹 $ xcopy test test2
-
创建文件
# 表示在当前目录下创建一个叫做 index.js 的文件 $ type nul> index.js
-
拷贝一份文件
# 表示复制一份 index.js 文件起名为 ceshi.js $ copy index.js ceshi.js
-
查看文件内的文本内容
# 表示查看 index.js 文件中的文本内容是什么 $ type index.js 在命令行中输入 chcp 65001 回车, 默认编码是GBK,切换成UTF-8
-
给文件或者目录重命名
# 表示把 index.js 更名为 abc.js $ ren index.js abc.js
-
删除文件
# 表示把当前目录下的 index.js 删除 $ del index.js
-
移动文件或文件夹
# 表示把当前目录下的 index.js 文件移动到当前目录下的 a 文件夹下 $ move index.js a
-
其他指令
-
做一些其他事情的时候使用的
-
清屏
# 表示把当前屏幕的所有内容都清除 $ cls
-
查看当前电脑 IP 信息
# 表示查看当前电脑的 IP 信息 $ ipconfig
-
测试某一个链接地址的网速
# 表示查看访问 百度 网站的速度 $ ping www.baidu.com
-
查看电脑信息
# 表示查看当前电脑的信息 $ systeminfo
-
NODE 的导入导出
node
的开发是模块化开发- 每一个 js 文件都是一个独立的模块
- 都有自己独立的作用域
- 我们可以通过 导入导出 的方式把多个 js 文件合并在一起
导入
-
在 node 里面,我们使用
require
来导入一个文件// 我是 index.js 文件 require('./a.js') console.log('我是 index.js 文件')
-
当我在命令行运行
index.js
文件的时候- 首先会把
a.js
文件运行一遍 - 然后再继续执行我自己文件内部的代码
- 首先会把
-
也可以再导入的时候接受另一个文件导出的内容
// a 接受到的内容就是 a.js 这个文件导出的内容 // 如果 a.js 文件中什么都没有导出,那么接受到的就是一个 空对象 const a = require('./a.js')
导出
-
我们在写一个 js 文件的时候,可以向外导出一些内容
-
将来在这个文件被导入的时候,就可以接受到一些内容
// 我是 a.js // 每一个 js 文件都会有一个对象叫做 module // 在 module 里面有一个成员,叫做 exports // 每一个 js 文件会默认把 module.exports 导出 // 也就是说,我们向 module.exports 中添加什么内容 // 那么就会导出什么内容 module.exports.name = 'Jack' module.exports.age = 18
-
将来这个文件被导入的时候,接受到的内容就是一个对象,里面有两个成员
// 我是 index.js const a = require('./a.js') console.log(a) // { name: 'Jack', age: 18 }
模块化
- 在 node 的开发过程中
- 我们是把每一个功能独立做成一个模块
- 然后在使用 导入导出 的方式把他们关联在一起
- 利于维护
- 准确定位
- 我们一般把模块分为三种
- 内置模块 (node 天生就带有的模块)
- 自定义模块 (我们自己写的文件)
- 第三方模块 (从网上下载的别人写好的模块)
NODE 常用的内置模块
- 刚才是我们自己写的模块
- 现在我们来聊聊常见的内置模块
FS 模块
-
fs
是 node 的一个内置模块 -
专门用来操作文件的
-
使用的时候直接导入就可以使用了
const fs = require('fs') // 接下来就可以使用 fs 这个变量去操作文件了
异步读取文件内容
-
异步的读取某一个文件内的内容
const fs = require('fs') // 因为是异步读取,所以要在回调函数里面获取结果 fs.readFile('./text.txt', 'utf8', function (err, data) { // err 表示读取的时候出现的错误 // data 表示读取到的内容,如果出现错误,那么是 data 是没有内容的 })
同步读取文件内容
-
同步读取某一个文件的内容
const fs = require('fs') // 因为是同步读取,所以直接以返回值的形式接收读取的内容就可以 const res = fs.readFileSync('./text.txt', 'utf8') // 同步读取的时候,如果出错会直接在控制台报错,并中断程序继续执行 // 如果没有错误,res 就会得到文件中的内容
异步写入文件
-
异步的向某一个文件中写入内容
const fs = require('fs') // 写入内容的时候,一般不会出现错误 // 因为如果没有这个文件的话,会创建一个这个文件在向里面写入内容 // 所以回调函数一般没什么用处,只不过是在写入文件结束后做些事情而已 // 虽然没有用处,但是必须要写 fs.writeFile('./text.txt', '我是要写入的内容', function () { console.log('写入完成') })
同步写入文件
-
同步的向某一个文件内写入内容
const fs = require('fs') // 因为是写入文件 // 没有返回值,因为一般都会写入成功 fs.writeFileSync('./text.txt', '我是要写入的内容')
依次写入内容文件
-
向某个文件内写入内容,依次叠加不会覆盖前面的内容
const fs = require('fs') // 写入内容的时候,一般不会出现错误 // 因为如果没有这个文件的话,会创建一个这个文件在向里面写入内容 // 所以回调函数一般没什么用处,只不过是在写入文件结束后做些事情而已 // 虽然没有用处,但是必须要写 fs.appendFile('./a.txt','依次写入'+ new Date()+'\n',(err,data)=>{ console.log(err) })
Path模块
- node 自带的模块, 专门用于和路径相关的操作
- 绝对路径:当路径从 根目录开始书写的时候
- 例如:
- d:/a/b/c.html
- /a/b/c.html
- 例如:
- 相对路径:当路径从 非根目录开始书写的时候
- 例如
- ./b/c.html
- c.html
- 例如
- 路径的规则
- a 名字
- / 目录
- . 表示当前
- … 表示上一级
- d: 盘符
//0 导入path模块
/ 1. 组装成相对路径
// 语法: path.join(路径片段1, 路径片段2, ...)
// 返回值: 组装好的相对路径
const p1 = path.join('a', 'b/c', 'd', 'e.html')
console.log(p1)
// 2. 组装成绝对路径
// 语法: path.resolve(路径片段1, 路径片段2, ...)
// 返回值: 组装好的绝对路径
// 注意: 如果你的第一个参数就是根目录信息, 那么不会组装当前的绝对路径
// 注意: 如果你的第一个参数不是根目录信息, 那么会按照当前文件的绝对路径来拼接
const p2 = path.resolve('c:', 'b/c', 'd', 'e.html')
console.log(p2)
// 3. 解析路径
// 语法: path.parse
// 返回值: 该路径地址内的所有信息
const res = path.parse('D:/02_CD_H5-2209/07-第七周/31_DAY/03_代码/04-path模块/a/b/c.html')
console.log(res)
/*
{
// 根目录
root: 'D:/',
// 详细路径
dir: 'D:/02_CD_H5-2209/07-第七周/31_DAY/03_代码/04-path模块/a/b',
// 完整文件
base: 'c.html',
// 文件类型
ext: '.html',
// 文件名名称
name: 'c'
}
*/
url模块
-
node 内置的模块 专门用于操作url地址的
// 0. 导入 const url = require('url') // 1. 解析地址 // 语法: url.parse(地址, 是否深度解析) // => 地址(必填), 你要解析的内容 // => 是否深度解析(选填), 默认是 false // -> false 表示不把 query 转换成对象 // -> true 表示把 query 转换成对象 // 返回值: 解析好的内容 const res = url.parse('http://tyjrfwcs.cdwh.gov.cn:8396/serveDetail?enterpriseId=1&name=wanghao#abc') console.log(res) /* Url { 协议 protocol: 'http:', 要不要斜线 slashes: true, 作者 auth: null, 域(域名+端口号) host: 'tyjrfwcs.cdwh.gov.cn:8396', 端口号 port: '8396', 域名 hostname: 'tyjrfwcs.cdwh.gov.cn', 哈希值 hash: '#abc', 携带参数 search: '?enterpriseId=1&name=wanghao', 查询字符串 query: 'enterpriseId=1&name=wanghao', 路径名称 pathname: '/serveDetail', 路径(路径名称+参数) path: '/serveDetail?enterpriseId=1&name=wanghao', // 完整地址 href: 'http://tyjrfwcs.cdwh.gov.cn:8396/serveDetail?enterpriseId=1&name=wanghao#abc' }
http模块
- node 自带的一个模块, 用于开启一个 http 服务
- 服务器
- 提供服务 的 机器
=> 服务: 提供一些内容(文件, 数据)
=> 机器: 电脑
+ 有一台电脑, 运行了一个 “软件”
=> 这个 “软件” 可以向外开放一个 “文件夹”(根目录)
=> 当有其他电脑访问到当前这台电脑的时候, 并且访问指定 “软件” 的时候
=> 那么就相当于在访问这个文件夹
=> 例子:
-> 电脑: 10.9.10.9
-> 软件: 6666
-> 开放文件夹: D://a/
-> 当你打开浏览器访问 http://10.9.10.9:6666, 就在访问这台电脑上的 D://a/
- node 就可以利用 http 模块来充当 “软件” 启动服务
// 0. 导入模块
const http = require('http')
// // 1. 创建服务的方法
// // 语法: http.createServer(函数)
// // => 函数: 每当前端有一个请求来到当前服务器的时候, 触发一次
// // 返回值: 一个服务
// const server = http.createServer(function () {
// // 每当前端有一个请求发送过来的时候, 就会触发一次
// console.log('我执行了一次')
// })
// // 2. 给当前服务配置一个端口号
// // 语法: 服务.listen(端口号, 回调函数)
// server.listen(8080, () => console.log('启动服务成功'))
// 1. 创建服务的方法
// 语法: http.createServer(函数)
// => 函数: 每当前端有一个请求来到当前服务器的时候, 触发一次
// 返回值: 一个服务
const server = http.createServer(function (req, res) {
// 第一个形参 req(request): 表示本次请求的所有信息(请求报文内的信息)
// 第二个形参 res(response): 表示本次响应的相关信息, 你只要添加到 res 内, 会由服务器自动组装响应报文返回给前端
// 语法: res.end(字符串)
// 作用: 返回给前端信息
// res.end('hello world')
// 返回中文 避免乱码
res.setHeader('Content-type', 'application/json;charset=utf-8')
// 我们对服务器做的操作, 就是在这里提供各种各样的服务
// 当前端请求一个 /a 的时候我给他一个 hello world
// 当前端请求一个 /b 的时候我给他一个 abcdefg
// req.url 表示请求地址
// req.method 表示请求方式
console.log(req.url)
console.log(req.method)
if (req.url === '/a') {
res.end('hello world')
}
if (req.url === '/b') {
res.end('abcdefg')
}
})
// 2. 给当前服务配置一个端口号
// 监听端口,等待连接
// 端口范围在 0 - 65535 之间,通常取 1024 之后的端口自定义
// http 默认端口 80,https 默认端口 443
// 语法: 服务.listen(端口号, 回调函数)
server.listen(8888, () => console.log('启动服务成功'))
NPM
- 在我们安装
node
的环境的时候,会自动帮我们一起安装一个npm
环境 - 就好像我们安装一些软件的时候,会自动在帮我们安装一些什么
xxx软件管家
/xxx游戏
之类的东西 - 但是
npm
不是垃圾软件,而是一个我们超级实用的工具
检测是否安装
-
和检测 node 一样
-
在命令行输入指令
$ npm -v
-
能够得到一个版本号就可以了
了解 npm
-
什么是 npm 呢
-
我们可以把他想象成一个大超市,一个装着所有我们需要用到的
插件
/库
/框架
的超市 -
我们要下载一个
jQuery
插件
- 我们可以选择去官网进行下载
-
可以选择去 GitHub 上查找并下载
- 也可以选择直接在命令行用 npm 下载
-
我们要下载一个
bootstrap
- 我们可以选择去官网进行下载
- 可以选择去 GitHub 上查找并下载
- 也可以选择直接在命令行用 npm 下载
-
也就是说,npm 包含着我们所有的第三方的东西
-
我们需要的时候,只要打开终端,就可以使用指令来帮我们下载
- 再也不需要去官网找了
-
而且,npm 不光可以在后端使用,也可以在前端使用
-
npm 只不过是一个依赖于 node 环境的大型的包管理器
使用 npm
- 我们想使用 npm 只要打开命令行就可以了
- 作为一个 包管理器
- 可以帮我们下载一些 插件 库 框架 之类的东西供我们使用
下载包
-
打开命令行
-
输入下载的指令
# 表示使用 npm 这个工具下载一个 jquery $ npm install jquery
-
下载完毕以后,就会在当前目录下多出一个文件夹
- 叫做
node_modules
- 在这个目录下就会有一个文件夹叫做
jquery
- 就是我们需要的东西了
- 叫做
-
npm 的下载默认是下载最新版本的包
-
我们也可以在下载的时候指定一下我要下载哪一个版本
# 表示使用 npm 这个工具下载一个 3.3.7 版本的 jquery $ npm install bootstrap@3.3.7
删除包
-
在删除包的时候,我们可以直接去
node_modules
文件夹中找到对应的包的文件夹删除掉 -
但是这样做并不好,我们还是应该使用命令行的指令来删除包
# 表示我要删除 jquery 这个包 $ npm uninstall jquery
-
这样,这个包就会被卸载了
管理项目
-
我们的每一个项目都有可能需要依赖很多的包(有插件/库/框架)
-
npm 会帮助我们记录,我们当前这个项目所使用的包
-
但是前提是,你要告诉 npm 说: “你来帮我管理整个文件夹”
-
我们依旧是使用指令在命令行来告诉 npm
# 表示告诉 npm 你来帮我们管理整个文件夹(也就是我的整个项目) $ npm init package-lock.json的作用 其实用一句话来概括很简单,就是锁定安装时的包的版本号,并且需要上传到git,以保证其他人在npm install时大家的依赖能保证一致 npm install 可以恢复被删除的node_modules包 保存到生产依赖(dependencies): npm install <pageName> --save 保存到开发依赖(devDependencies): npm install <pageName> --save-dev
生产依赖
我们下载的jQuery,在开发时参与源码编写,在发布上线的生产环境中也是需要它的。不仅在开发环境编写代码时要依赖它、线上环境也要依赖它,因此将它归类为"生产依赖"。
安装时执行 npm install jquery --save,它就会被记录在package.json的dependencies
开发依赖
假如我们用gulp对html进行压缩,我们通常会用到一个插件gulp-htmlmin。我们只希望它把html压缩完就ok了,并不希望它融入我们的项目代码中,即只存在于开发环境,因此把他归类为"开发依赖
安装时执行 npm install gulp-htmlmin --save-dev它就会被记录在package.json的devependencies下
npm 清除缓存
-
有的时候,有些包下载到一半,因为各种原因失败了(比如突然没有网了)
-
那么这个下载了一半的包 有可能 会被缓存下来
-
那么以后你再次下载的时候,就都是失败的状态
-
那么我们就要清除掉缓存以后,在重新下载
# 表示清除 npm 的缓存 $ npm cache clear -f
NRM
- 我们的
npm
虽然好用 - 但是有一个缺点
- 就是,他虽然在帮我们下载东西
- 但是他的下载地址是在国外
- 也就是说,每次使用 npm 下载的时候,都是去国外的服务器上进行下载
- 那么就会有很多不稳定的因素
- 而且相对时间比较长
nrm
就是一个用来切换npm
下载地址的工具(切换镜像源工具)
如果 你不想用 nrm 那么你可以百度下载 cnpm yarn
安装 NRM
-
nrm
如果想使用,那么需要我们自己安装一下 -
因为是我们的工具,所以使用
npm
就可以安装 -
依旧是使用指令的方式来进行安装
-
只不过这里要把这个
nrm
安装成一个全局的依赖,而不再是项目内部的依赖了- 全局依赖,一个电脑安装一次,就一直可以使用
-
我们使用指令安装一个全局
nrm
# 表示安装一个全局 nrm $ npm install --global nrm
检测安装
-
安装完毕之后,我们检测一下是否安装成功
-
和检测 node npm 的时候一样
-
在命令行使用指令查看一下版本号
$ nrm --version
-
能出现版本号,表示安装成功
使用 nrm
- nrm 里面存着好几个镜像源地址
- 我们要挑一个比较快的使用
检测镜像源地址
-
我们直接在命令行使用指令来查看所有镜像源地址的网速
# 表示查看 nrm 镜像源地址网速 $ nrm test
切换镜像源
-
我们检测完毕以后,就直到哪个比较快了
-
我们就使用指令切换一下镜像源地址就好了
# 表示切换到 taobao 镜像源地址 $ nrm use taobao
使用cnpm
由于npm的官网在国外,咱们在国内下载npm官网的资源由于网络限定比较多,容易下载失败或者丢失某些数据导致一直下载不成功。所以淘宝团队推出了cnpm工具,这个工具会把npm网站的资源同步在淘宝的网站里面,咱们下载会非常容易。
同步频率目前为 10分钟 一次以保证尽量与官方服务同步。
$ npm install -g cnpm --registry=https://registry.npmmirror.com
网站地址: https://npmmirror.com/
自动重启应用
在编写调试Node.js项目,修改代码后需要频繁的手动重启应用,非常繁琐。nodemon这个工具,它的作用是监听代码文件的变动,当代码改变之后,自动重启。
# 全局安装nodemon
npm i -g nodemon
# 执行node脚本
nodemon app.js
自定义npm脚本
通过package.json文件中的scripts自定义脚本命令:
{
"scripts": {
"test": "echo hello"
}
}
随后就可以在命令行中运行:
npm run test
如果需要更多的自定义命令,只需要按照上述的格式进行套用即可。