一 ,认知
Node.js 一门新的后端语言吗 ? 错误
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境 。
Chrome V8 引擎 ,这个引擎是用C++ 写的 , 这个引擎可以解析JS。浏览器就叫做JS的运行环境 。
V8引擎 ,添加到了Node.js中 , 那么就可以在后端来解析JS 。
Node.js是运行环境 。 (浏览器是前端的运行环境 ,Node.js 是后端的运行环境)
Node.js 去哪里下载 ? 英文官网 : nodejs.org 中文官网 nodejs.cn
在电脑的搜索里 输入 cmd ,输入 node -v ,如果打印出来版本号,说明安装成功 (全局环境变量ww)
Node.js 使用了一个事件驱动 , 非阻塞式 I\0 的模型 , 使其轻量又高效。
单线程与多线程 (多核运作,可以同时运行)
单线程 : 异步
Java 复杂处理 ,高并发不太好 。(同一时间)
Node.js 适合做高并发处理 , 因为单线程
Node.js 的包管理器 npm , 是全球最大的开源库生态系统 。
Node.js 想象成手机
npm 想象成手机里的商店
npm分三部分 :
纯前端模块 : jquery , bootstrap
纯后端模块 : express , mongoose
前后端都能用的模块 :moment .axios
二, node 操作
npm -v 查看npm的版本号
d:
cd 指定的路径
tab键提示 ,自动补全内容
cd… 回到前一个目录
cd空格 地址 , 快速进入
按住shift键不放 , 点击右键 , 打开 powershell .(加强版的cmd)
上下键 , 可以查看之前的输入历史记录
ctrl + c 退出操作
cls 清屏
安装淘宝镜像 npm.taobao.org
安装cnpm
cnpm -v 来看安装好了
npm 表示用什么软件来下载
npm install -g 全局安装
install 简写 i
–global 简写 -g
node 出控制台 ,在里面写js即可。
node node.js 写node 空格 文件名 来执行这个文件 ,如果是js文件 ,后缀名可以省略
安装nodemon , 实时监听文件的变化 (或者 node -dev 也能监听)
cnpm install -g nodemon
cd node
nodemon node.js
vscode 里的终端 。新终端 选cmd , 也可以。
三, 自定义的NodeJS模块
提供对外的接口 , 通过module.exports
引入模块的方式 require() , 路径是一个相对路径(./)
用cmd , , nodemon 监听 1_node.js
1_node.js
//2_node.js
var a = require('./2_node.js');
console.log(a)
ctrl + c , 一下是继续向下执行 , 两下是退出 。
//2_node.js
var a = 123;
module.exports = a ;
//2_node.js
var a = 123;
var b = 456;
module.exports = { a ,b } ; // exports = module.exports
exports.a = a ;
exports.b = b;
exports = {a , b} // 不正确的写法
辅助对象module . 查看模块信息
module.id
module.filename
module.loaded
module.children
module.exports 模块对外输出的值
CommenJS . 一个模块化规范 (js应用于服务端)
四,如何使用第三方模块
第三方模块, 需要通过npm进行下载使用
npm i -g xxx : 全局安装 , 一般用在命令行中
npm i xxx : 局部安装 ,一般在代码中进行使用
cnpm i moment
node_modules文件夹 , 是用来放置所有第三方下载好的模块 。
npmjs.com 官网, 想要使用的第三方模块都可以搜到
下载模块 cnpm install xxx.js
日期格式化模块
用法
require() 引入的是下载对应模块的名字
//3_node.js
var moment = require('moment') // 模块名字,下载的啥写啥
var date = new Date();
console.log( moment(date).format('MMMM Do YYYY, h:mm:ss a') );
为什么有的模块只有前端能用 , 有的模块只有前端能用 ??\
前端是基于浏览器环境的 , 有能力操作DOM , 这些框架都是操作DOM的 ,后端没有DOM , moment , axios 和DOM没关系 ,所以后端能用
五, 内置模块
node.js 自带的模块 , 不需要下载
1.url
// 3_node.js
var url = require('url');
var str = 'https://www.npmjs.com/package/moment?username=xiaoming&age=20#abc';
console.log( url.parse( str ) )
console.log( url.parse( str ,true).query.username ) // xiaoming
console.log( url.format( str ) ) // 和parse相反
url.parse()
会解析一个url字符串并返回一个url对象
第二个参数布尔值true , 对query属性解析成对象
url.format()
返回一个从urlObject格式化后的url字符串
方法是parse()的相反操作
2.querystring
var querystring = require('querystring')
var str = 'https://www.npmjs.com/package/moment?username=xiaoming&age=20#abc';
str = url.parse(str).query // 'username="xiaoming"&age=20'
console.log( querystring.parse( str ) ) //{username:xiaoming,age:20}
var querystring = require('querystring')
var str = 'username-xiaoming@age-20';
console.log( querystring.parse( str , '@' ,'-') )//参数规定由什么来决定多个值
var obj = {username : 'xiaoming' , age : 20};
console.log( querystring.stringify( obj , '@' ,'-' ))
3.process进程
浏览器才有 window , document ,后端没有
//4_node.js
console.log( window ) //报错
后端有global ,前端没有
global一般可以省略
window.console.log(); // 前端的内置函数
global.console.log(123) //后端可以打印出123
process 进程 (任务管理器中的进程) (进程中的线程 相当于工厂里有很多工人在工作 ,CPU 相当于工人在做工)
node 4_node.js
console.log( process.argv ) // 找到进程里运行的信息 ,拿到输入的命令。返回结果的数组
console.log( process.pid ) //找到这个进程
setInterval(function(){} , 1000)
setTimeout(function(){
process.exit();//关闭这个进程
},10000)
//node添加事件采用on事件 , 和jquery很像
process.on('exit' , function()){
console.log('进程已退出')
})
console.log(123) //底层就是进程的输出操作 , process.stdout.write('123');
process.stdin.on('dara',function(info){
console.log(info); // Buffer是二进制的数据流, 数据传输方便,快,默认是Buffer
})
// <Buffer 63 5e 66 6f>二进制太长了, 用十六进制的写法 来 表示二进制
console.log(info.toString()) //转回我们认识的写法
//计算器
var number1 , number2 ;
//stdin 输入 , stdout 输出
process.stdout.write('请输入第一个数字');
process.stdin.on('data',function(inof){
if( number1 ==undefined ){
number1 = parserInt(info)
process.stdout.write('请输入第二个数字')
}else{
number2 = parseInt(info);
process.stdout.writr(' 结果 +' +(number1 + number2))
}
})
4.全局变量
__filename 文件名
__dirname 文件夹
console.log( __filename, __dirname) // 一般用来找文件的绝对地址
5.path模块
var path = require('path');
console.log(__dirname + '\\a.txt');
console.log( path.join(__dirname , 'b.txt') );
console.log( path.resolve( 'hello' , 'b.txt') ); //自动转成绝对路径
console.log( path.relative( 'D\\ke\\qf_dl121212' ) ); //可以得到一个相对的地址
console.log( path.parse('D:\\ke\\qf_dl112\\b.txt') )
{
root:'D:\\',
dir: 'D:\\ke\\qf_dl112',
base:'b.txt',
ext:'.txt',
name: 'b'
}
6.fs模块 操作文件
//异步的读取
var fs = require('fs');
fs.readFile('./aaa.txt',(err , info)=>{
//err: 如果读取文件失败 ,会返回一个err对象 ,如果读取成功, 返回null
console.log(err)
if( err ){
return;
}
console.log(info) //文件里的内容 buffer
console.log( info.toString() ) //或者参数加一个 'utf-8'
})
在fs模块中 , 一般方法都提供异步和同步操作
回调参数不要忘了 , 写入的内容是覆盖
当要写入的文件不存在的时候 , 会先创建再写入
fs.writeFile('./bbb.txt' , 'hahah' ,()=>{})
fs.writeFile('bbb.txt' , 'newBbb.txt' ,()=>{}) //给文件改名
创建文件夹
fs.mkdir('aaa',()=>{})
var fs = require('fs');
var argv = process.argv;
fs.mkdir(argv[2] , ()=>{});
fs.writeFile( path.join( argv[2] , 'index.html') ,``,()=>{} )
var fs = require('fs');
fs.readdir('myApp' , (err,info)=>{
console.log(info) //返回读取到的一个数组
})
var fs = require('fs');
fs.stat('bbb.txt',(err ,info)=>{
console.log(info); //获取文件信息
})
六, npm
package.json 模块的说明文件 ( 产品说明书 )
如果要开发一个node项目 , 一定要先创建项目说明书
deDependencies 所有通过–save-dev 下载的模块都会写入deDependencies字段
dependencies 所有通过 --save下载的模块 都会写入 dependencies字段
script脚本 使用脚本 npm run dev 可以让调用的名字变得简短
npm run 字段
start test stop 这几个单词的时候 ,是可以省略run的 其他的不可以
创建项目说明书 npm init 项目名字不要大写
package name :(myproject)
version : (1.0.0)
license: (MIT)
is this ok ? y
npm init -y 快速创建
下载 安装
npm i -g xxx
npm i xxx 等价于 npm i xxx --save 等价于 npm i -S --save ( 把这个模块放到生产环境和开发环境 )
moment jquery
npm i xxx – save dev => npm i xxx -D --save-dev (这个模块只能在开发环境使用)(压缩文件)
gulp 工具 webpack 工具 babel 工具
卸载模块:
npm uninstall -g xxx
npm uninstall -s xxx
如何把代码给别人?
不去拷贝node_modules ,通过npm i 命令去package.json下载所有第三方所要用到的模块
cnpm i 通过package.js (用cmd打开说明书)下载所有的第三方插件 ,就生成node_modules
七 ,http模块
http ,https模块为网络通信模块
分别对应的端口是 80 443
爬虫 : 把别人网站的东西拿来自己用
后端没有跨域问题(浏览器才有同源策略)
var http = require('http');
var https = require('https');
var cheerio = require('cheerio');
//发起一个请求
http.get(url)
https.get('https://www.lagou.com/',(req)=>{
var res = '';
req.on('data',(chunk)=>{ //事件,可以分批次爬到数据
console,log(chunk);
res += chunk;
})
req.on('end',function(){ //事件,读取结束后触发一次
console.log( res )
getData( res );
})
})
function getData( html ){
var $ = cheerio.load(html);
$('.menu_box h2').each(i , elem){
console.log( $(elem).text().trim() )
}
}
cnpm i -S cheerio
没有http.post() , 要想发送POST请求 , 用 http.request()