一.npm含义
1.npm
npm全称--->(node package manager)
npm有两种含义 :
第一种: 包管理工具node package manager
第二种:npm网站代码托管平台
2.npm包管理工具图表命令大全
3.npm init -y原理
作用: 快速初始化包,创建package.json
文件
package.json文件 : 项目中用到了哪些依赖包,以及包名、版本号,只要你下载了包,这个文件就会记录你下载哪些包,和下载的版本
4.npm i 包名原理
1.访问npm服务器
2.从npm服务器搜索包
3.搜索到之后,找包的仓库地址
4.下载包到你目录的node_module文件
5.会把包地址放入package.lock.json文件,用于更新提高速度
5.拓展-moment第三方包使用
moment的官网:Moment官网
moment中文网:Moment中文网
二. 全局包与本地包
1.本地包: npm i 包名
(1).在哪里执行命令,就在哪个文件夹安装;
(2).只对这个文件夹生效;
2.全局包: npm i 包名 -g
(1).无论在哪里执行命令,都会装到你的C盘根目录;
(2).对整个操作系统生效,任何时候都能使用;
三.开发依赖与生产依赖
下载包的时候,有两种选择:开发依赖与生产依赖(默认情况下,我们所有的包都会选择生产依赖 )
1.开发依赖: 只在开发的时候会用到,到了生产(上线)环境用不上
2.生产依赖:上线之后也需要使用
3.举个例子: 比如房子装修
开发依赖: 装修的时候需要用到工具。 铲子、尺子、水泥、木材
生产依赖:装修完了需要用到:水泥、木材
四.跨域
1.跨域准备
1.html页面代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<button class="btn1">点我发送ajax1</button>
<button class="btn2">点我发送ajax2</button>
<script>
document.querySelector('.btn1').addEventListener('click',function(){
// 给我们自己nodejs服务器发请求
let xhr = new XMLHttpRequest()
xhr.open('get', 'http://127.0.0.1:3000/getList')
xhr.send()
xhr.onload = function() {
console.log(xhr.responseText)
}
})
document.querySelector('.btn2').addEventListener('click',function(){
//给别人的网易云服务器发请求
let xhr = new XMLHttpRequest()
xhr.open('get', 'http://c.m.163.com/nc/article/headline/T1348647853363/0-40.html')
xhr.send()
xhr.onload = function() {
console.log(xhr.responseText)
}
})
</script>
</body>
</html>
2.js页面代码(准备一个app.js文件,搭建nodejs服务器)
//1.导入http模块
const http = require('http')
//2.创建服务器
const app = http.createServer( (req,res)=>{
if( req.url === '/getList' ){
//响应json字符串
res.end('{"name":"张三"}')
}
} )
//3.开启服务器
app.listen(3000,()=>{
console.log('服务器启动成功')
})
3.启动服务器,不出意外的话就是要出意外了
2.跨域介绍
只要是出现跨域问题,浏览器就会出现一个固定格式(没有之一)的报错信息
Access to XMLHttpRequest at '服务器url地址' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource
跨域:ajax地址与页面地址不同源
ajax地址:跨域只会出现在ajax请求中
页面地址:location.href
不同源:协议名,主机名(ip),端口号 三个完全不一致(逻辑或)
同源:协议名,主机名(ip),端口号 三个完全一致(逻辑与)
3.同源策略
同源策略:协议名,主机名,端口号 三个完全一致(逻辑与)
页面地址:http://127.0.0.1:5000/index.html
ajax2: https://127.0.0.1:3000/abc 不同源,协议名不同
ajax3: https://m.163.com:3000/abc 不同源,主机名不同
ajax1: http://127.0.0.1:3000/abc 不同源,端口号不同
ajax4: http://127.0.0.1:5000/abc 同源
浏览器有同源策略的原因:如果ajax地址和页面地址不同,浏览器就会认为你是向其他服务器发送请求.为了保护你的安装,浏览器就会拒绝介绍其他服务器的数据
4.解决跨域
1.JSONP技术:以前的技术,现在很少使用了
2.CORS技术:后台设置响应头,前端不需要任何处理
3.代理服务器:帮浏览器 转发请求的 服务器
(1)浏览器给nodejs代理服务器发请求
(2)代理服务器帮你 转发请求 给目标服务器(网易云)
(3)目标服务器(网易云)把数据响应给 nodejs服务器
(4)nodejs服务器把数据 响应给 浏览器
五.跨域解决方案:CORS
CORS :全称cross origin resource share
(资源共享)
工作原理: 服务器 在返回响应报文的时候,在响应头中 设置一个允许的header
//1.导入http模块
const http = require('http')
//2.创建服务器
const app = http.createServer( (req,res)=>{
if( req.url === '/getList' ){
//设置允许跨域响应头
res.setHeader('Access-Control-Allow-Origin', '*');
//响应json字符串
res.end('{"name":"张三"}')
}
} )
//3.开启服务器
app.listen(3000,()=>{
console.log('服务器启动成功')
})
res.setHeader('Access-Control-Allow-Origin', '*');
这行代码的工作过程:浏览器请求发送了, 服务器也响应了, 但是浏览器发现了跨域访问, 判断是否有`响应头: Access Control Allow Origin' (后端是否允许跨域访问, 如果允许, 浏览器就把数据留下, 否则抛弃掉然后报错)