基础概念
初识
- nodejs是什么? 运行环境,支持在服务端运行js,使用的Google V8引擎
- 除了不能使用DOM和BOM 其他js的用法都能上
- 跟js一样属于单线程,但js只能跟浏览器打交道,NodeJs使得js还能能跟操作系统打交道,对磁盘读写
- 用java做后端不好吗? 对开发人员而言nodejs开发更快,你去实践一下就知道真香了,nodejs适合运用在高并发、I/O密集、少量业务逻辑的场景,对于比较大型的系统还是会优先选Java,多线程处理CPU重的系统还是挺6的,emmm
模块化
nodeJs 会自动给每个js文件都用 function(exports,require,module,__filename,__dirname)包裹
函数的返回值为module.exports 跟exports 指向一个地址,module.exports的为准
require('xxx') 引入外部模块会返回一个对象,并执行模块自身内容(自调用函数)
核心模块
fs http path os url等等
- fs文件操作模块
fs.mkdir('/xxx',err=>{})
f.writeFile('/xxx','hello',err=>{})
f.appendFile('/xxx','+hello'err=>{})
f.readFile('/xxx','utf8',(err,data)=>{})
// 大文件可创建stream流
const resource =fs.createReadStream('/xxx')
const dist=fs.createWriteStream('/xxx')
resource.pipe(dist)
- http模块
http.createServer((req,res)=>{}).listen('3000')
- Buffer缓冲区
起源:起初js语言没有二进制数据类型,在处理文件流(二进制数据的流动)时必须要使用到二进制数据,因此nodeJs搞了个Buffer类,每当要处理I/O操作移动数据时就可能用到这个Buffer。
用于处理二进制数据流。
类似数组,呃,本质跟数组没大关系,只不过它存放的是二进制数据(用16进制显示),一个元素占一个字节
xxx=Buffer.from() // 创建一个Buffer对象
xxx.toString('编码格式') //二进制转字符
Buffer.alloc(size) // 创建一个指定大小的Buffer
PS:写一个项目下来基本上没用到,因为很多小框架已经把它封装好了
4. path
不用引入path,通用路径: __dirname:当前所在文件夹的目录路径;__filename:当前文件目录路径
在文件操作路径上使用相对路径不可靠,因为那是相对于执行node命令所处的路径而言!!
补充
服务端渲染:可以使用art-template等插件作为模版引擎(处理文件特殊字符标志的数据替换),在初次请求页面时就在服务端把数据都填充好。
缺点:页面显示慢。
客户端渲染:服务端仅仅把页面传过来,数据还得另作请求。
缺点:不利于SEO,异步渲染SEO查不到。
项目可采用两种渲染方式相结合,像商品列表页采用服务端渲染,有利于用户搜索,评论列表用客户端渲染,速度更快。
实战
工具
- express :更方便操作http模块
中间件
app.get('/home',(req,res,next)=>{next()})
app.get('/home',(req,res,next)=>{res.send('hhhh')})
中间件就是一个函数 ,对请求处理做了一些特定封装,然后把处理结果返回给下一个中间件使用(next),直到遇到没有next的中间件
针对一个请求可以设置多个中间件,进行多次处理(重上往下匹配)
app.use((req,res,next)=>{}) // app.use匹配所有请求方式,直接传入请求函数,表示对所有请求统一处理
app.use(‘/home’,(req,res,next)=>{})针对特定路径处理
app.use('/home',authMiddleware(),(req,res)=>()) 封装中间件后这样子写也可以
app.use((err,req,res,next)=>{}) 接收四个参数时统一对抛出的错误进行处理,err来自上一个中间件next(err)
- mongoDB数据库
安装(一些工具模块还得再去官网下载复制到mongdb bin 下)
/usr/local cd /usr/local
// 下载
sudo curl -O https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-4.0.9.tgz
// 解压
sudo tar -zxvf mongodb-osx-ssl-x86_64-4.0.9.tgz
// 重命名为 mongodb 目录
sudo mv mongodb-osx-x86_64-4.0.9/ mongodb
Mac bash配置
vim ~/.bash_profile
export PATH=/Users/tao/go/bin:$PATH //添加
source ~/.bash_profile
mongod 启动
mongo 进入mongo操作(最好下个视图软件mongobooster)
show dbs 查看数据库列表
use '数据库名称' 切换到指定数据库
db 查看当前连接到数据库
db.student.find() 查表内容
show collections 查所有表
mac上配置后重新打开终端无法提示找不到命令,如果你在Mac上使用的是zsh等shell工具,需要再做如下配置:
vim ~/.zshrc
// 添加
if [ -f ~/.bash_profile ]; then
source ~/.bash_profile
fi
// 执行
source ~/.zshrc
- 服务端实用性包
npm i mongoose 代码中更方便操作mongodb
npm i nodemon -g 热更新项目,使用nodemon xxx.js
服务端想使用session 可安装npm i express-session
npm i multer 专门处理上传文件中间件
multer-aliyun-oss OSS上传图片插件 bctypt 密码加密 jsonwebtoken 生成token
- 客户端实用性包
npm i less less-loader@7.3.0 -D (用webpack4要指定版本号)
使用:
import VueAwesomeSwiper from 'vue-awesome-swiper'
import 'swiper/css/swiper.css'
Vue.use(VueAwesomeSwiper)
vue add element
vue add axios
vue add router
npm i vue2-editor 富文本编辑器
npm i swiper@5.4.5 vue-awesome-swiper (记得加版本不然报错) npm i dayjs 时间日期库更轻量
步骤
服务端:
npm i -y 初始化项目
新建index.js 做入口
在package.json 自定义脚本:serve: nodemon index.js
引入express创建web服务 npm run serve 启动
新建文件db.js 使用mongoose统一连接数据库
新建文件夹models,放表结构schema
封装路由const router=express.Router({mergeParams:true}) router.get....exports
在入口一一引入,注意顺序
前端:
vue create xxx
配置路由
全局公共样式配置
发布和部署
-
生产环境配置
.env.development 配置开发 .env.production 配置生产
执行npm run build 编译目标文件指向服务端某个文件
然后在服务器入口index.js配置静态资源开放app.use('/public',express.static(__dirname+'/public')) // public也要公开 app.use('/admin',express.static(__dirname+'/public/admin')) app.use('/',express.static(__dirname+'/public/web'))
-
买:服务器+域名(去实名)、配置域名解析、服务器安全组添加80端口、去备案域名(选xg的可不用备案)
-
装:服务器使用命令行安装Ngnix 、Node(配淘宝镜像)、Git、MongoDb、pm2(后台启动类似nodemon)
- 以CentOS7.6为例 linux.51yip.com/search/yum
yum install git sudo yum install nginx sudo systemctl enable nginx 设置开机启动 sudo systemctl start nginx 启动命令 sudo systemctl status nginx 检查nginx的状态 yum install -y nodejs //-y自动应答yes-----npm -v 有毛病,改用nvm 安装 1. git clone git://github.com/creationix/nvm.git ~/nvm 2. echo "source ~/nvm/nvm.sh" >> ~/.bashrc 3. source ~/.bashrc 4. nvm install v16.14.0 5. nvm use v16.14.0 6. node -v npm -v mogodb装的时候失败了好几次~~(跟版本有关系) vim /etc/yum.repos.d/mongodb.repo 然后把下面的复制进去 [mongodb-org] name=MongoDB Repository baseurl=http://mirrors.aliyun.com/mongodb/yum/redhat/7/mongodb-org/4.2/x86_64/ gpgcheck=0 enabled=1 安装 sudo yum install -y mongodb-org npm install -g pm2 //要不要软链接
npm install pm2@latest -g pm2 start index.js //运行
- 配:git
git config --global user.name "xx" git config --global user.email xx@xx.com ssh-keygen 一路回车 cat xxxx.pub 复制粘贴到git的ssh中
- 配:nginx配置
在 /etc/nginx/conf.d 下面创建一个配置文件叫 default.conf,内容如下: server { listen 80; location / { proxy_pass http://xx.xx.xx.xx:xxxx; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_cache_bypass $http_upgrade; } } 删除掉/etc/nginx/nginx.conf里面定义的 server
systemctl start nginx 启动 改了配置需要systemctl reload nginx 如果80端口起不来可试试: firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --reload
- mongodb 命令
sudo systemctl start mongod 启动 sudo systemctl stop mongod 关闭 sudo systemctl restart mongod 重启 sudo systemctl enable mongod 开机自启动 sudo systemctl status mongod 查看启动状态
- mongodb 本地数据库迁移:
mongodump -d '数据库' 将生成的文件拷贝至服务器中 在服务端执行mongorestore 即可
4.服务器git拉代码 启动服务端即可