node.js 初识

node.js
今天学的node.js
头都给学炸了。

一:为什么有node.js这个玩意儿?

    因为有个国外的很厉害的大牛,自己学了n多语言,然后给大企业开发,过程中很多都是多线程,巴拉巴拉巴拉....然后chrom8引擎出来 正好契合js js从上往下单线程执行,飞毛腿....(这段故事听zz说的 ·.·)
    主要是解决高并发问题(很多很多人同时请求一个数据得等着,然后就炸了。适用于中间层的开发。太大的问题自然有很厉害的大佬解决!)
    然后这个很厉害的人现在要开发新的玩意儿了,可能node.js活不了太久了。

二:干正事儿,下载node.js

首先!chrome 一下 node.js
下载一个长期维护版 emm


维护版下载.png
三:下载完成之后在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文件这里,右键在资源管理器中打开(就是找到文件路径,这样方便一点。不嫌麻烦自己可以一点一点敲进去。)


在资源管理器中显示.png

3.打开之后在空白区域按住shift键 ,右键打开命令窗口。


打开cmd.png

4.输入node 文件名运行该js文件。将在node环境下编译该文件。输出hello world。
运行js.png
五,再写一个模块玩一下。

1.新建一个模块(js文件)(文化模块)。

console.log("我是模块一");

exports.x = "我是模块一中的x";
exports.y = "我是模块一中的y";
exports.foo = function(){
    console.log("我是模块一中的方法foo");
}

会发现,直接运行这个js文件会显示我是模块一,如图。


运行结果.png

辣么,我们要把模块中的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文件看一下是什么样子。


调用文化模块.png

可以看到输出的跟对象一样一样,通过点语法就可以输出里面的内容啦。函数就加一个小括号啦。

demo

定义输出学生模块,定义输出老师模块。
整个这两个模块到班级模块中。
最后引入班级模块,调用方法,输入参数即可输出。
①:学生模块+暴露


学生.png

②:老师模块+暴露


老师.png

③:整合模块+暴露
整合.png

④:引用文件+输出
引用.png

⑤:运行效果
运行效果.png
六:全局。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);

显示结果。

显示结果.png
十一:文件系统(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);

你可能感兴趣的:(node.js 初识)