一、包管理工具
1、npm
npm(node package manager)是nodejs的包管理器,用于node插件管理(包括安装、卸载、管理依赖等)。
在向node添加任何包之前,需要创建一个文件: package.json。它包含了应用或程序最基本的信息,比如名字、版本、作者、反馈的地址、依赖关系等等。
所有node都应有这个json文件。使用npm init来初始化。
npm init
2、为什么我们需要一个包管理工具呢?
因为我们在Node.js上开发时,会用到很多别人写的JavaScript代码。如果我们要使用别人写的某个包,每次都根据名称搜索一下官方网站,下载代码,解压,再使用,非常繁琐。于是一个集中管理的工具应运而生:大家都把自己开发的模块打包后放到npm官网上,如果要使用,直接通过npm安装就可以直接用,不用管代码存在哪,应该从哪下载。
更重要的是,如果我们要使用模块A,而模块A又依赖于模块B,模块B又依赖于模块X和模块Y,npm可以根据依赖关系,把所有依赖的包都下载下来并管理起来。否则,靠我们自己手动管理,肯定既麻烦又容易出错。
3、npm包安装方式
- 本地安装:
本地安装的包在当前目录下的node_modules里面,本地安装的包一般用于实际的开发工作 - 全局安装:
全局安装的包位于Node.js环境的node_modules目录下,全局安装的包一般用于命令行工具。
4、npm常用的命令
-
升级npm(自己升级自己)
npm install --global npm
-
安装包(如果没有指定版本号,那么安装最新版本)
npm install -g 包名称 (全局安装)
npm install 包名称 (本地安装)
-
安装包的时候可以指定版本
npm install -g 包名称@版本号
-
卸载包
npm uninstall -g 包名
-
更新包(更新到最新版本)
npm update -g 包名
-
查看命令的使用帮助
npm 命令 --help
5、开发环境和生产环境
开发环境(平时开发使用的环境)
生产环境(项目部署上线之后的服务器环境)
--save 向生产环境添加依赖 dependencies
--save-dev 向开发环境添加依赖 DevDependencies
安装依赖:
命令行输入 npm install --production只会安装package.json里面dependencies属性所对应的包,不会安装 DevDependencies 所对应的包。
命令行输入 npm install 则package.json里面dependencies和 DevDependencies 属性所对应的包都能安装。
会在package.json的json对象中加入dependencies或DevDependencies 属性,属性值是一个对象{包名:版本号}
6、cnpm
因为npm安装插件是从国外服务器下载,受网络影响大,可能出现异常。cnpm是国内服务器,稳定,速度快。
cnpm的安装:
npm install -g cnpm --registry=https://registry.npm.taobao.org
测试:
cnpm -v
如果有出现版本号证明安装成功
cnpm跟npm用法完全一致,只是在执行命令时将npm改为cnpm
如果你不想安装cnpm,就可以在安装包的时候使用淘宝镜像来安装,例如:
npm install jquery --registry=https://registry.npm.taobao.org
但是每次手动这样加参数就很麻烦,所以我们把这个选项加入到配置文件中:
npm config set registry https://registry.npm.taobao.org
只要经过了上面命令到配置,则以后所有的npm install 都会默认通过淘宝都服务器来下载。
如何验证配置是否成功:
查看npm 配置信息 :npm config list 里面就会显示register
二、get和post请求
说起get/post请求,可能都不是很陌生,因为表单提交到服务器一般都使用get/post请求。
1、获取get请求内容
由于get请求直接被嵌入在路径中,url是完整的请求路径,包括?后面的部分。
nodejs中的url模块中的parse函数提供了这个功能。
获取url里面参数又两种形式:
- 使用url,第二个参数必须加true
var url = require('url');
var reqUrl = req.url;
var queryUrl = url.parse(reqUrl,true).query;
console.log(queryUrl);
- 使用url+queryString
var url = require('url');
var queryString = require('querystring');
var reqUrl = req.url;
var queryUrl = url.parse(reqUrl).query;
console.log(queryString.parse(queryUrl));
get请求在form中的应用
<form method="get" action="http://localhost:50">
<input type="text" name="userName">
<input type="text" name="pwd">
<input type="submit" value="提交">
</form>
var url = require('url');
var http = require('http');
var server = http.createServer();
server.on('request',function(req,res){
res.setHeader('Content-Type','text/plain;charset=utf-8')
var reqUrl = req.url;
var parseUrl = url.parse(reqUrl,true).query;
var user = parseUrl.userName;
var pwd = parseUrl.pwd;
console.log(user,pwd);
res.end("用户名是:"+ user+ '\n' + "密码是:"+ pwd);
})
server.listen(50,function(){
console.log('run~');
})
2、获取post请求内容
post请求的内容全部的都在请求体中,http.ServerRequest并没有一个属性内容为请求体,原因是等待请求传输可能是一件耗时的工作。
post没有路径传值,post是事件接受
req.on('data') : 每次发送数据
req.on('end') : 数据发送完成
post请求在form中的应用
<form method="post" action="http://localhost:50">
<input type="text" name="userName">
<input type="password" name="pwd">
<input type="submit" value="提交">
</form>
var querystring = require('querystring');
var http = require('http');
var server = http.createServer();
server.on('request',function(req,res){
var surl = '';
req.on('data',(chunk)=>{
surl += chunk;
})
req.on('end',()=>{
console.log(querystring.parse(surl));
})
})
server.listen(50,function(){
console.log('run~');
})
3、表单提交中get和post方式的区别
- get是从服务器上获取数据,post是向服务器传送数据。
- get是把参数数据队列加到提交表单的action属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTPpost机制,将表单内各个字段与其内容放置在HTML header内一起传送到action属性所指的URL地址。用户看不到这个过程。
- get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。
- get安全性非常低,post安全性较高。
三、服务端渲染和客户端渲染的区别
1、客户端的渲染
2、服务器端端渲染
3、区别
-
客户端渲染不利于 SEO 搜索引擎优化
-
服务端渲染是可以被爬虫抓取到的,客户端异步渲染是很难被爬虫抓取到的
所以你会发现真正的网站既不是纯异步也不是纯服务端渲染出来的,而是两者结合来做的
例如京东,商品列表是采用的服务端渲染,目的是为了 SEO 搜索引擎优化,而它的商品评论列表为了用户体验,不需要 SEO 优化,所以采用客户端异步渲染 -
在一个页面中,如果右键查看源代码,可以看到源代码的时候就说明这个网站是服务端渲染过来的。
-
客户端用户体验会较好。服务端渲染说白了就是在服务端渲染模版引擎。