node.js
今天学的node.js
头都给学炸了。
一:为什么有node.js这个玩意儿?
因为有个国外的很厉害的大牛,自己学了n多语言,然后给大企业开发,过程中很多都是多线程,巴拉巴拉巴拉....然后chrom8引擎出来 正好契合js js从上往下单线程执行,飞毛腿....(这段故事听zz说的 ·.·)
主要是解决高并发问题(很多很多人同时请求一个数据得等着,然后就炸了。适用于中间层的开发。太大的问题自然有很厉害的大佬解决!)
然后这个很厉害的人现在要开发新的玩意儿了,可能node.js活不了太久了。
二:干正事儿,下载node.js
首先!chrome 一下 node.js
下载一个长期维护版 emm
三:下载完成之后在cmd中检查是否下载成功。
1.node -v 查看下载的node.js版本号(v8.12.0)
2.npm -v npm生态环境圈(共享和分发代码; 管理项目中的依赖项; 并与他人分享和接收反馈。)
四:要运行一下下node.js了。
运行环境:cmd
先玩一下。
1.创建一个js文件。作为一个萌新程序员随便输出一下hello world!
(当你的孩子会说的第一句话是hello world你会怎么办?)
console.log("hello world!")
我写详细一点。
2.在你创建的js文件这里,右键在资源管理器中打开(就是找到文件路径,这样方便一点。不嫌麻烦自己可以一点一点敲进去。)
3.打开之后在空白区域按住shift键 ,右键打开命令窗口。
4.输入node 文件名运行该js文件。将在node环境下编译该文件。输出hello world。
五,再写一个模块玩一下。
1.新建一个模块(js文件)(文化模块)。
console.log("我是模块一");
exports.x = "我是模块一中的x";
exports.y = "我是模块一中的y";
exports.foo = function(){
console.log("我是模块一中的方法foo");
}
会发现,直接运行这个js文件会显示我是模块一,如图。
辣么,我们要把模块中的x和y以及这个方法给输出来,就暴露到外部。
2.调用模块(js文件)。
新建一个js文件,接受模块一暴露出去的部分,x,y和方法。
在通过新建的js文件显示暴露出去的部分。
模块调用:
在node中,通过requir()函数,引入外部模块。
requir()两种参数。
核心模块:
js自带模块,或者通过npm打包安装好的模块,引入模块名字即可。比如fs:var fs = require("fs");
文化模块:
自己写的模块。尚未打包,引入文件路径,不要带上后缀名。
不要带上后缀名! 不要带上后缀名! 不要带上后缀名!
定义一个变量调用并接收这个文件。(不要加后缀名),再将其输出。
var mod = require("./mod01");
console.log(mod);
然后我们再巴巴运行这个调用模块的js文件看一下是什么样子。
可以看到输出的跟对象一样一样,通过点语法就可以输出里面的内容啦。函数就加一个小括号啦。
demo
定义输出学生模块,定义输出老师模块。
整个这两个模块到班级模块中。
最后引入班级模块,调用方法,输入参数即可输出。
①:学生模块+暴露
②:老师模块+暴露
③:整合模块+暴露
④:引用文件+输出
⑤:运行效果
六:全局。global。
刚刚可以看到就是在页面b中调用了页面a的方法和属性。emm...
所谓暴露就是把这些方法和属性添加为全局对象。 ------------global。
由此可以看出,任意一个模块,在写完之后,都会被装进一个函数中。
这个函数长这个样子:
function(exports,requir,module,__filename,__dirname){
在模块中代码在运行时都会装进这个函数中。
}
exports:该对象用来将变量或者函数暴露在外部。
require:该对象用来引入外部模块。
module:
module表示模块本身。
exports是module的属性
可以使exports暴露,也可以使module.exports暴露
__filename
当前模板的完整路径
__dirname
当前模块在文件夹的完整路径
七:了解完全局之后再好好暴露一下。
刚刚看到模块都在一个方法里,这个方法有module,export是模块的属性。
所以一般通过使用moudle.exports 暴露 。
我们把要暴露的内容全都写在这个属性中。如下:
module.exports = {
name:"小可爱",
age:"18",
sayHi:function(){
return "我叫"+this.name;
}
}
按照第一个,现在要写一个js调用这个暴露数据的js文件啦。
老规矩:定义一个变量调用并接收这个文件。(不要加后缀名),再将其输出。
var cute = require("./mo_ex");
console.log(cute.sayHi());
八:关于包。package。了解一下。
1.package
每一个上线项目,都会在一个包里。讲的很通俗,就这个样子把。
这个文件就叫package.json(固定写法)。
讲道理,我就写了这么两句话,一个是项目名称,第二个是版本号。
记得两边都要双引号包裹起来。
我谢了这两句话,然后在nmp中初始化,就自己添加了好多多多度详细信息。
{
"name": "lly",
"version": "1.0.0"
}
就这样子了。
{
"name": "lly",
"version": "1.0.0",
"dependencies": {
"math": "0.0.3"
},
"description": "这里是注释文件。\r 项目描述,介绍,规模\r markdown标记语言。",
"main": "global.js",
"devDependencies": {},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
2.readme.md (readme 读我,后缀名md,这个是注释文件)
注释文件,一般写什么项目介绍,规模。啥啥啥的。
采用的是markdown语言。
九:npm(Node Package Manager)
字面意思:node.js的包管理工具。
它是一个命令行工具。
node.js以来npm,形成良好的生态圈。
1.npm的作用:
可以将包传到node.js社区。
也可以从node.js下载任意demo。
2.我们就了解一点点基本的命令就可以。
查看版本:npm -v
帮助说明:npm
搜索包名:npm search 包名
下载包:npm install 包名
全局安装模式:npm install 包名 -g (下载的文件添加到环境变量,整个电脑都可以使用这个包)
删除一个模块:npm remove 包名。
初始化项目:npm init(上面自己写的package就是运行过初始化之后自动生成了package.json文件)
下载即直接输入命令。下载完成之后就可以用了啊。
定义一个变量并结束这个模块。
可以直接使用模块中的方法啦。
var mt = require("math");
console.log(mt.add(12,20));
3.npm-----cnpm
淘宝镜像。
因为node是外国人开发的,所有的下载都要翻墙,emm
去翻墙,
或者下载淘宝镜像,每十分钟更新一次,不用担心。
$ npm install -g cnpm --registry=https://registry.npm.taobao.org
前面的$ window系统不需要。
其他方法都一样一样的使用。
十:buffer(存放数据的一个缓冲区)
存储的都是二进制文件,但是都是以十六(0-255 00-ff)进制显示的。
定义一个变量存点字符串,
再定义一个变量用buffer中的from缓冲一下存起来,再显示。
一般都为from,后面那么为补充的
/*from 将字符串转为buffer */
var str = "1616,小可爱";
var buf = Buffer.from(str);
console.log(buf);
console.log(buf.length);
var num = "我,爱,你";
var bufnum = Buffer.from(num);
console.log(bufnum);
console.log(bufnum.length);
/* alloc 创建固定大小的buffer
0-255
*/
var buf1 = Buffer.alloc(5);
buf1[0] = 12;
buf1[1] = 255;
buf1[2] = 16;
buf1[3] = 32;
console.log(buf1);
显示结果。
十一:文件系统(File System)
文件系统需要引入fs模块。
上面有说过模块分核心模块和文件模块。
呐呐呐~这个文件系统属于核心模块。所以不用下载,直接通过require引入。
因为学到最后有个pipe方法可以一步完成,就不做过多的解读了。
1.同步文件的写入。
首先要有一个txt文件。
再如下
调用文件模块。
var fs = require("fs");
/* 将打开的文件存入fs 打开文件openSync
参数:文件路径 可读写 w r
*/
打开txt文件并写参数 w可写。
var fd = fs.openSync("./lly.txt","w");
/* 在文件中写入内容 */
fs.writeSync(fd,"我是写入的内容");
/* 保存并且关闭 */
fs.closeSync(fd);
在cmd中运行没有提示跳转则成功。
2.异步文件的写入。
调用文件模块。
var fs = require("fs");
打开txt文件并可写。
fs.open("./asynlly.txt","w",function(err,fd){
/* 判断文件是否出错 */
if(!err){
/* 如果没有出错,则可以写入文件 */
fs.write(fd,"我是写入的汉字",function(err){
if(!err){
console.log("写入文件成功!");
}
fs.close(fd,function(err){
if(!err){
console.log("关闭文件成功!");
}
})
})
}else{
console.log(err);
}
})
3.简单文件的写入。
fs.writeFileSync(file,data[,options])
-file 要操作的文件路径
-data 要写入的数据
-options 选项,可以对写入,进行一些设置
flag的打开状态:
r 读取文件,不存在则异常、
r+ 读写文件,不存则异常
w 打开文件用于写入操作,不存在则创建,如果存在则截断
wx 读写,如果存在则打开失败
a 打开文件用于追加,如果不存在则创建
ax 打开文件用于追加,如果存在,则是失败
ax+ 打开文件进行读取和追加,如果存在则失败
var fs = require("fs");
var dat = " 我是简单写入的文件";
/* 可以写绝对路径 */
注意转义/或者\\
fs.writeFile("C:\\Users\\Administrator\\Desktop\\hhh.txt",dat,{flag:"a"},function(err){
if(!err){
console.log("写入成功");
}else{
console.log(err);
}
})
4.流式文件写入
因为前面三种不是个写入大文件,所有用流式,开个口,慢慢写,不关就可以一直写。emm
第一步:引入文件模块。
第二步:定义变量创建可写流。
第三步:通过监听用可写流的write方法欠佳数据。
第四步:关闭流。监听close。
var fs = require("fs");
/* 创建可写流 */
/* 只要流创建了,就会打开,只要不手动关闭,是不会关闭的 */
var ws = fs.createWriteStream("./lly.txt");
/* 通过监听open事件和close事件,监听流的打开和关闭 */
ws.once("open",function(){
console.log("流打开了。");
/* 通过write向文件中输入内容 */
ws.write("写进来的第一条 \t我前面是不是有一个空格 我要换行了\n");
ws.write("写进来的第二条 \n");
ws.write("写进来的第三条 \n ");
ws.end();
})
ws.once("close",function(){
console.log("流关闭了。");
})
读取文件和写入文件一样一样的。把write改成read就好啦
写一个流式文件读取。
5.流式文件读取
var fs = require("fs");
/* 读取timg这张图片 把它写入22.jpg中。 22.jpg就显示成timg.jpg啦 */
fs.readFile("./timg.jpg",function(err,data){
if(!err){
console.log(data);
fs.writeFile("./22.jpg",data,function(err){
if(!err){
console.log("写入成功!");
}
})
}
})
6.读取文件并写入。
最后教了一个pipe方法,我有点吐血。
感觉学的四种读取,写入都gg了。
第一步:引入文件模块。
第二步:定义变量创建可读流。
第三步:定义变量创建可写流。
第四步:可读变量调用pipe方法,方法中写可写变量。
就是读取文件rs.pipe(ws)并写入。
var fs = require('fs');
var rs = fs.createReadStream('./22.jpg');
var ws = fs.createWriteStream('./44.jpg');
rs.pipe(ws);