web服务器
构成
- 机器: 电脑
- 数据库:mysql | sqlserver | mongoDB | oracle
- 数据库存的是: 数字|字符
- 磁盘(硬盘) 文件本身(图,视频,PDF) 文件服务器
- 管理程序:nodejs(管理前后端工程文件)
前后端交互流程
大后端
用户 - > 地址栏(http[s]请求) -> web服务器(收到) - > nodejs处理请求(返回静态、动态)->请求数据库服务(返回结果)->nodejs(接收)->node渲染页面->浏览器(接收页面,完成最终渲染)
大前端
用户 - > http[s]请求 -> web服务器(收到) - > nodejs处理请求(返回静态、动态)->请求数据库服务(返回结果)->nodejs(接收)->返回给前端(渲染)->浏览器(接收页面,完成最终渲染)
实现
引入http模块
let http = require('http')
创建web服务 返回http对象
let app = http.createServer((req,res)=>{
req 请求体 浏览器->服务器
req.url 地址 提取地址栏数据
req.on('data') 提取非地址栏数据 所有的http[s]都会触发end事件
req.on('end')
res 响应 服务器->浏览器
res.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});响应头设置
res.write(字符/数据<string><buffer>) 返回数据
res.end() 结束响应 必须
})
监听服务器
app.listen(端口,[地址],[回调])
监听成功,回调一次
端口: 1-65535 1024以下系统占用
虚拟地址localhost 真实域名xx.duapp.com
更新后,需要每次服务器自动重启
推荐命令行工具:
supervisor
nodemon
安装方式:
npm install supervisor -g
fs模块
磁盘操作,文件操作
读取
fs.readFile('文件路径',[编码方式],(err,data)=>{})
[^err ]: err 错误 ,null没有错误
变量 = fs.readFileSync('文件路径')
处理错误
try{要排错的代码}catch(e){}
更名
fs.renameSync('改前','改后');
删除
fs.unlinkSync('文件路径')
静态资源托管
什么是静态资源
xx.css
xx.html
xx.js
xx.图片
xx.json
xx.字体
…
前端资源请求
<a href=".."></a>
<img src="..."/>
location.href="..."
body{
background:url(....)
}
后端资源读取
fs.readFile(文件名,[编码方式],回调(err,data));
接口实现
前端
表单:get/post/put/delete/…
js: ajax/jsonp
后端
处理方式:http[s]
address: req.url
抓取 get请求的数据 切字符 | url模块
!address: req.on('data',(chunk)=>{CHUNK==每次收到的数据buffer})
req.on('end',()=>{ 接收完毕 切字符 querystring })
postman 一个不用写前端,就可以发出各种请求的软件 下载
url模块
作用
处理 url型的字符串
用法
url.parse(str,true) 返回 对象 true处理query为对象 {a:1,b:2}
str -> obj 返回 对象 true
protocol: ‘http:’, 协议
slashes: true, 双斜杠
auth: null, 作者
host: ‘localhost:8002’, 主机
port: ‘8002’, 端口
hostname: ‘localhost’, baidu
hash: ‘#title’, 哈希(锚)
search: ‘?username=sdfsdf&content=234234’, 查询字符串
query: ‘username=sdfsdf&content=234234’, 数据
pathname: ‘/aaa’, 文件路径
path: ‘/aaa?username=sdfsdf&content=234234’, 文件路径
href: ‘http://localhost:8002/aaa?username=sdfsdf&content=234234#title’
url.format(obj) 返回url字符串
obj -> str 返回str
querystring 模块
作用
处理查询字符串 如:?key=value&key2=value2
用法
querystring.parse(str) 返回对象
querystring.stringify(obj) 返回字符串
模块化 commonJS
介绍
是主要为了JS在后端的表现制定,commonJS 是个规范 nodejs / webpack 是一个实现
ECMA 是个规范 js / as 实现了他
其他模块化规范:seajs.js / require.js CMD/AMD/UMD es5
作用
是变量具有文件作用域,不污染全局变量
系统模块
http
fs
querystring
url
输入
require('模块名')
require('模块名').xx 按需引用
不指定路径:先找系统模块-> 再从项目环境找node_modules|bower_components (依赖模块)->not found
指定路径 : 找指定路径 -> not found
支持任何类型
输出
exports.自定义属性 = 值 | any
批量输出 都是属性
可输出多次
module.exports = 值 | any //module.exports = {a,b,fn}
只能输出一次
注意
commonJS 是 nodejs 默认模块管理方式,不支持es6的模块化管理方式,但支持所有es6+语法
NPM
作用
帮助你安装模块(包),自动安装依赖,管理包(增,删,更新,项目所有包)
安装到全局环境
- 安装到电脑系统环境下
- 使用时在任何位置都可以使用
- 被全局安装的通常是:命令行工具,脚手架
npm i 包名 -g 安装
npm uninstall 包名 -g 卸载
安装到项目环境
只能在当前目录使用,需要使用npm代运行
初始化项目环境
npm init
初始化npm管理文件package.json
package-lock.json 文件用来固化依赖
{
"name": "npm", //项目名称
"version": "0.0.1", //版本
"description": "test and play", //描述
"main": "index.js", //入口文件
"dependencies": { //项目依赖 上线也要用
"jquery": "^3.2.1"
},
"devDependencies": { //开发依赖 上线就不用
"animate.css": "^3.5.2"
},
"scripts": { //命令行
"test": "命令行",
},
"repository": { //仓库信息
"type": "git",
"url": "git+https://github.com/alexwa9.github.io/2017-8-28.git"
},
"keywords": [ //关键词
"test",'xx','oo'
],
"author": "wan9",
"license": "ISC", //认证
"bugs": {
"url": "https://github.com/alexwa9.github.io/2017-8-28/issues"//问题提交
},
"homepage": "https://github.com/alexwa9.github.io/2017-8-28#readme"//首页
}
项目依赖
只能在当前项目下使用,上线了,也需要这个依赖 --save
//安装
npm i 包名 --save
npm install 包名 -S
npm install 包名@x.x.x -S
//卸载
npm uninstall 包名 --save
npm uninstall 包名 -S
开发依赖
只能在当前项目下使用 ,上线了,依赖不需要了 --save-dev
npm install 包名 --save-dev
npm install 包名 -D
查看包
npm list 列出所有已装包
npm outdated 版本对比(安装过得包)
npm info 包名 查看当前包概要信息
npm view 包名 versions 查看包历史版本列表
安装所有依赖
npm install
安装package.json里面指定的所有包
版本约束
^x.x.x 约束主版本,后续找最新
~x.x.x 保持前两位不变,后续找最新
* 装最新(?)
x.x.x 定死了一个版本
选择源
npm install nrm -g 安装选择源的工具包
nrm ls 查看所有源
nrm test 测试所有源
nrm use 切换源名
安装卡顿时
ctrl + c -> npm uninstall 包名 -> npm cache 清除缓存 -> 换4g网络 -> npm install 包名
发布包
- 官网 注册
- 登录 (发布包的时候,必须要登录到npm自己的源上面进行发布)
npm login
登录- 输入 user/password/email
- 创建包
npm init -y
- 创建入口index.js
- 编写,输出
- 发布
npm publish
- 迭代
- 修改版本号
npm publish
- 删除
npm unpublish
包的发布、迭代、删除,需要在包目录下进行
删除包,有时需要发送邮件
扩展
peerDependencies 发布依赖
optionalDependencies 可选依赖
bundledDependencies 捆绑依赖
contributors 为你的包装做出贡献的人。贡献者是一群人。
files 项目中包含的文件。您可以指定单个文件,整个目录或使用通配符来包含符合特定条件的文件
YARN
安装
注意:为省事,不要用npm i yarn -g,去安装yarn,而是去下载压缩包,保证注册表和环境变量的硬写入,后期通过yarn安装全局包时方便
使用
初始化一个新项目
yarn init
添加依赖包
yarn add [package]
yarn add [package]@[version]
yarn add [package]@[tag]
将依赖项添加到不同依赖项类别中
分别添加到 dependencies
,devDependencies
、peerDependencies
和 optionalDependencies
类别中:
yarn add [package] --save | -S
yarn add [package] --dev | -D
yarn add [package] --peer
yarn add [package] --optional
升级依赖包
yarn upgrade [package]
yarn upgrade [package]@[version]
yarn upgrade [package]@[tag]
移除依赖包
yarn remove [package]
安装项目的全部依赖
yarn
或者
yarn install
安装到全局
yarn global add [package] //global的位置测试不能变
yarn global remove