一、nodemon热加载
不管是node.js原生开发,还是借助express,kora等框架开发node.js的情况下,在对代码做出更新后,都是需要重启已生效我们的文件的。为项目添加热加载(nodemon),可以避免一次次手动的重启浪费精力。
nodemon是一个node.js的辅助开发工具,具有监听目录文件的作用。并在监听后作出响应。
nodemon用来监视node.js应用程序中的任何更改并自动重启服务,非常适合用在开发环境中。
nodemon将监视启动目录中的文件,如果有任何文件更改,nodemon将自动重新启动node应用程序。
nodemon不需要对代码或开发方式进行任何更改。 nodemon只是简单的包装你的node应用程序,并监控任何已经改变的文件。nodemon只是node的替换包,只是在运行脚本时将其替换命令行上的node。
安装:
npm install nodemon //安装到本地
npm install -g nodemon //安装到全局
npm install -s nodemon //安装到项目依赖
使用:安装好以后了,我们将已经启动的node.js项目关闭,然后通过nodemon命令重启。
nodemon index.js
自动重新运行:
最初编写nodemon是为了重新启动诸如web服务器之类的挂起进程,但是现在它支持干净地退出的应用程序。如果您的脚本干净地退出,nodemon将继续监视该目录(或多个目录),如果有任何更改,则重新启动脚本。
手动重新启动:
当nodemon正在运行时,如果您需要手动重新启动您的应用程序,而不是停止并重新启动nodemon,您可以输入带有回车的rs,并且nodemon将重新启动您的进程。
二、NPM
1、NPM使用介绍
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:
-
允许用户从NPM服务器下载别人编写的第三方包到本地使用。
-
允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
-
允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
可以通过输入 "npm -v" 来测试是否成功安装。命令如下,出现版本提示表示安装成功:
$ npm -v
2.3.0
如果安装的是旧版本的 npm,可以通过 npm 命令来升级,命令如下:
npm install npm -g
2、使用NPM安装模块
npm 安装 Node.js 模块语法格式如下:
npm install <Module Name>
以下实例,我们使用 npm 命令安装常用的 Node.js web框架模块 express:
npm install express
安装好之后,express 包就放在了工程目录下的 node_modules 目录中,因此在代码中只需要通过 require('express') 的方式就好,无需指定第三方包路径。
var express = require('express');
3、安装方式
本地安装(local):
1. 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
2. 可以通过 require() 来引入本地安装的包。
npm install <Module Name>
全局安装(global):
1. 将安装包放在 /usr/local 下或者你 node 的安装目录。
2. 可以直接在命令行里使用。
npm install <Module Name> -g
安装到项目依赖:会把依赖包名称添加到 package.json 文件 dependencies 键下。
npm istall <Module Name> --save
4、NPM常用指令
查看所有全局安装的模块:
npm list -g
查看某个模块的版本号:
npm list grunt
卸载 Node.js 模块:
npm uninstall express
卸载后,你可以到 /node_modules/ 目录下查看包是否还存在,或者使用以下命令查看:
npm ls
更新模块(更新到最新版本):
npm update <Module Name>
搜索模块:
npm search <Module Name>
创建模块:创建模块,package.json 文件是必不可少的。我们可以使用 NPM 生成 package.json 文件,生成的文件包含了基本的结果。每一个项目创建时 ,先创建一个package.json文件它代表了这个项目的一些结构和配置信息(项目的清单)。
npm init-y
//Package.json 属性说明
name - 包名。
version - 包的版本号。
description - 包的描述。
homepage - 包的官网 url 。
author - 包的作者姓名。
contributors - 包的其他贡献者姓名。
dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。
repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。
main - main 字段指定了程序的主入口文件,require('moduleName') 就会加载这个文件。这个字段的默认值是模块根目录下面的 index.js。
keywords - 关键字
在 npm 资源库中注册用户(使用邮箱注册):
npm adduser
发布模块:
npm publish
三、自定义模块
方法一:
exports.属性名 = 值/变量;
注意:可以导出多个exports.属性名 = 值/变量;
主模块/ 引入模块.js
const myModule = require("./自定义模块.js");
自定义模块.js
// 自定义模块
// =========1.变量============
let username = "Jack";
let userInfo = {age:10, grade:"H5"};
// 导出/ 暴露内容
exports.username = username;
exports.userObj = userInfo;
//直接赋值
// =========2.变量============
exports.userage = 18;
// =========3.方法============
exports.getInfo = function () {
console.log(userInfo,username);
}
//另一个方法表示
module.exports.address = "北京";
//module.exports 等同于exports
console.log(module.exports === exports);//输出true
方法二:
module.exports = 对象;
moudule.exports = 类/构造函数/函数;
注意:写多个module.exports = 对象,会覆盖上一个,修改其的值;
导出的类/构造函数必须通过new 下进行导出,对象不能new;
实例:
自定义模块2-2.js
//自定义模块2
module.exports = {
user:"丽丽",
tag: 100
}
//方法
//此时user和tag输出的为undefined,因为这个exports方法会直接覆盖上面的exports
module.exports = function () {
console.log("自定义模块2");//主模块调用:myModule2()或new myModule2()
}
// 导出===类(构造函数)
module.exports = class UserName{
// console.log("我是个类/构造函数");//导进的模块必须通过new 下进行导出,对象不能new
}
//这样不能进行导出,相当于又声明了一个exports,exports添加属性和方法是可以进行导出,修改属性或者方法就不能进行导出
// exports = {
// a:100
// }
主模块.js
// 自定义模块2
console.log("=============自定义模块2===============");
const myModule2 = require("./自定义模块2-2.js");
// console.log(myModule2);
console.log(myModule2.user);
console.log(myModule2.tag);
// myModule2();//还可以new myModule2()表示
new myModule2();
四、MVC
MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:
模型(Model)、视图(View)和控制器(Controller)。
MVC模式最早为Trygve Reenskaug提出,为施乐帕罗奥多研究中心(Xerox PARC)的Smalltalk语言发明的一种软件设计模式。
MVC可对程序的后期维护和扩展提供了方便,并且使程序某些部分的重用提供了方便。而且MVC也使程序简化,更加直观。
- 视图View:界面设计人员进行图形界面设计;
- *控制器Controller:对请求进行处理,负责请求转发;
- *模型Model:程序编写程序应用的功能(实现算法等等)、数据库管理;
在MVC模式中,Web用户向服务器提交的所有请求都由控制器接管。接受到请求之后,控制器负责决定应该调用哪个模型来进行处理;然后模型根据用户请求进行相应的业务逻辑处理,并返回数据;最后控制器调用相应的视图来格式化模型返回的数据,并通过视图呈现给用户。
实例:
1.在项目中引入router文件夹
2.创建后端入口文件 和 前端src静态资源文件
3.端入口文件的配置和使用:
//入门文件
var http=require("http")
var router=require("./router/router.js")
http.createServer((req,res)=>{
router(req,res)
}).listen(81)
router.use("/mydata",router.route.say)
router.use("/mydata2",router.route.mydata2)
//route文件
module.exports = {
say(req,res){
console.log(req.query)
var arr=[{title:"xxxx1",price:188},
{title:"xxxx2",price:188},
{title:"xxxx3",price:188},
{title:"xxxx4",price:188},
{title:"xxxx5",price:188}]
res.json(arr)
},
mydata2(req,res){
console.log(req.query)
res.json({msg:"我是第二个接口的数据"})
}
}
router文件
var url = require("url")
var route=require("./route.js")
var querystring=require("querystring")
var fs=require("fs")
module.exports = function(req, res) {
console.log(req.url)
var pathname = url.parse(req.url).pathname.substr(1)
req.query=querystring.parse(url.parse(req.url).query)
res.json=(arg)=>{res.end(JSON.stringify(arg))}//把传入的对象转化为json数据 再传给前端
if(module.exports.route[pathname]){
//数据接口的路由
module.exports.route[pathname](req, res)
}else{
//静态资源的托管
fs.readFile(__dirname+"../src",(err,data)=>{
res.end(data)
})
}
}
module.exports.route = {...route}
module.exports.use = function(pathname, callback) {
module.exports.route[pathname.substr(1)] = callback
}