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);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容

  • 交易费用一定会存在,在现实里无处不在,甚至代价高昂。因此,用制度,风俗习惯,道德规范来规定和约束一些行为,是非常必...
    浪客诗心阅读 229评论 0 0
  • 60秒语音: 1.以前的价值观侧重对错,现在更侧重聪明和愚蠢之分,更注重高下之分。 文章 转自 罗胖曰(鲁迅介绍)...
    宝贝瓜瓜阅读 123评论 0 0
  • 大嫂快救我阅读 203评论 0 0
  • 我在家里通常都过着每天配两个配音的生活方式。其中,我收藏了一个名字叫《玛泽的故事第八集》我突然在想:“是不是一个孩...
    先祖stone阅读 2,178评论 2 4
  • 和朋友闲聊天,谈起了心态一事。她一向是争强好胜的主,事事好强累心费神耗精力,却乐此不疲。 今天不知为什么,一反往日...
    闫大姐oo阅读 211评论 0 1