NodeJs快速入门

NodeJs入门介绍

Node.js是一个Javascript运行环境(runtime)。实际上它是对Google V8引擎进行了封装。
所以 语法还是JavaScript的语法,只不过它封装了一些类库,可以更多的事。

nodejs官网

在命令行中,可以使用node

常用命令:

1.node -v,查看电脑安装的node版本

2.node,进入node的环境,可以执行你写的js代码

3.在node环境下,使用ctrl+c 或者输入[.exit],退出node环境

4.node *.js,执行某个js文件

5.cd,进入到某个文件夹

6.pwd,显示当前文件夹的路径

7.ls,显示当前文件夹内的文件

node.js:称node或nodejs,可以运行在服务器端的的js平台。

前端的js后服务器端的js区别:

1.前端的js,浏览器就是解析器;服务器端的js,node.js是平台,是解析器

2.前端的js,主要的功能DOM操作;服务器端的js,主要功能是搭建服务器,提供数据

3.服务器端的js,去掉了与DOM操作的相关的内容,没有兼容性问题。

webstorm工具支持运行js,快捷键 ctl+shift+r
退出webstrom工具运行js的平台快捷键 shift+esc

NodeJs之package包

多个模块组合在一起,就形成了包(package)
包就是一个文件夹,在文件夹中包含了多个文件(模块)
包结构如图

例如,一个人(包含头和身体)

包的使用步骤

body.js

//创建身体
exports.create = function () {
    return "body";
}

head.js

//创建头
exports.create = function () {
    return "head";
}

main.js

var head = require("./head.js");
var body = require("./body.js");
//把身体和头部组合在一起
exports.create = function () {
    return {
        head: head.create(),
        body: body.create()
    }
}

package.js是使用npm配置时自动生成的json文件,下面会说到

当前文件 04-package.js与person文件夹同级

方式1

var main = require("./person/main.js");
var person = main.create();
console.log(person);

方式2:配置包的入口(main.js)

npm:node package manager,命令行工具,在安装nodejs环境的时候,已经附带安装了npm

使用npm来配置包的信息(npm init),其中

name:包的名字

entry point:包的入口

注意:npm init会在当前目录中生成package.json文件,用于记录输入的信息

var person = require("./person");
console.log(person.create());

npm配置包信息步骤,使用webstorm终端

1.进入到包文件夹

2.npm init(命令行工具初始化)

3.name:(person)  person代表包文件夹名

4.version:(1.0.0) 默认版本号为1.0.0

5.description:对于包的描述,例如:创建一个人对象

6.entry point:(main.js),组合模块的js文件

7.test command:无

8.git repository:github adress github地址

9.keywords:创建对象

10.author:作者

11.license:(ISC):这个ISC许可证是一个宽松的自由软件许可证写的互联网系统协会(ISC)

NodeJs之模块

模块: 把一些通用的代码写到不同的 js 文件中, 每一个文件就是一个模块

创建模块

以下的方法只能在模块内使用

var name;
function setName(aName) {
    name = aName;
}
function getName() {
    return name;
}
var name;
function setName(aName) {
    name = aName;
}

function getName() {
    return name;
}

如果想在模块外部使用, 需要配合 exports 对象来实现

exports 对象特征

1. 空对象

console.dir(exports);

2. 可以为对象添加属性和方法

exports.age = 10;
console.dir(exports);
exports.age = 10;
console.dir(exports);

利用 exports 对象的第二个特性, 把方法和属性添加到 exports 对象上

新建文件 03-module.js 文件, 文件内容如下:

exports.setAge = function (aAge) {
    this.age = aAge;
}
exports.getAge = function () {
    return this.age;
}
console.dir(exports);
exports.setAge = function (aAge) {
    this.age = aAge;
}
exports.getAge = function () {
    return this.age;
}
console.dir(exports);

3. 在其他文件中使用 require 来获取 exports 对象

新建 use-module.js 文件

使用模块, 步骤如下:

1. 获取 exports 对象, 导入模块: require(“路径”); 可以省略 js 后缀

var module = require("./03-module.js");

2. 使用模块

console.log(module);
//设置年龄,获取年龄
module.setAge(123);
var age = module.getAge();
console.log(age);
console.log(module);

//设置年龄,获取年龄
module.setAge(123);
var age = module.getAge();
console.log(age);

重复导入, 获取的模块都是同一个 exports 对象

var module1 = require("./03-module.js");
module1.setAge(321);
var age = module.getAge();
console.log(age);
var module1 = require("./03-module.js");
module1.setAge(321);
var age = module.getAge();
console.log(age);

Node之http模块

Node.js: 内部支持http服务环境

// 导入http模块
var http = require("http");
//创建服务,并监听某个端口
/*参数说明
req:request,客户端的请求
res:response,服务器的响应
*/
http.createServer(function(req,res){
    //当客户端访问时执行
    //设置响应头,响应状态码和返回内容的格式和编码
    res.writeHead(200,{
        'Content-type':'text/html;charset=utf-8'
    });
    //设置响应内容,可以设置多次
    res.write("

你好世界

"
); res.write("

hello,world!

"
); //响应结束并返回内容 res.end("

可可

"
); }).listen(3000); console.log("服务器已经启动,并且开始监听3000端口"); // 导入http模块 var http = require("http"); //创建服务,并监听某个端口 /*参数说明 req:request,客户端的请求 res:response,服务器的响应 */ http.createServer(function(req,res){ //当客户端访问时执行 //设置响应头,响应状态码和返回内容的格式和编码 res.writeHead(200,{ 'Content-type':'text/html;charset=utf-8' }); //设置响应内容,可以设置多次 res.write("

你好世界

"
); res.write("

hello,world!

"
); //响应结束并返回内容 res.end("

可可

"
); }).listen(3000); console.log("服务器已经启动,并且开始监听3000端口");

注: js 中的代码修改后, 需要再次运行才能生效
再次运行的快捷键 ctrl+r

NodeJs之Path模块

注意: cmd+左键, 点击模块名, 进入模块声明部分

//导入系统的模块path,用于对文件路径进行处理
var path = require("path");
//格式化文件路径
var pathString = "./a//b/c/../d";
var str = path.normalize(pathString);
console.log(str);
//文件路径拼接,并规范化输出路径
var str = path.join("./","/a","//b","c","../","d");
console.log(str);
//__dirname:获取当前目录的绝对路径
console.log(__dirname);
var str = path.join(__dirname,"01-info.js");
console.log(str);
//判断是否是绝对路径
//注:判断以路径的开头为准,以斜杠开头的都是绝对路径
var result = path.isAbsolute('./a/b');
console.log(result);
var result = path.isAbsolute('../a/b');
console.log(result);
var result = path.isAbsolute('a/b');
console.log(result);
var result = path.isAbsolute('/a/b');
console.log(result);
var result = path.isAbsolute('/a/../b');
console.log(result);
//把相对路径转换成绝对路径
//1.默认以根目录作为起点
var str = path.resolve("a/b");
console.log(str);
var str = path.resolve("01-info.js");
console.log(str);
var str = path.resolve("/a");
console.log(str);
var str = path.resolve("./a");
console.log(str);
var str = path.resolve("../a");
console.log(str);
//2.以指定的路径开始
var str = path.resolve("/a","b");
console.log(str);
var str = path.resolve("a","b");
console.log(str);
//获取从 绝对路径1到绝对路径2 的相对路径
var str = path.relative("/a/b/c","/a/d/e");
console.log(str);
//获取当前文件所在的目录
var str = path.dirname();
console.log(str);
var str = path.dirname("a");
console.log(str);
var str = path.dirname("/a");
console.log(str);
var str = path.dirname("/a/b/c/d.txt");
console.log(str);
//获取路径的最后一部分
var str = path.basename("/a/b/c/d.txt");
console.log(str);
var str = path.basename("/a/b/c/index.html");
console.log(str);
var arr = str.split(".");
console.log(arr[0]);
//指定文件后缀,来获取文件名
var str = path.basename("/a/b/c/1.2.3.index.html",".html");
console.log(str);
//获取文件的后缀名(扩展名)
var str = path.extname("/a/b/c/1.2.3.index.html");
console.log(str);
//练习:写一个函数,提供文件路径,返回获取的文件名
function getFileName(pathString){
    return path.basename(pathString,path.extname(pathString));
}
console.log(getFileName("a/b/1.txt"));
console.log(getFileName("a/b/2.html"));
function getFileName2(pathString) {
    return path.parse(pathString).name;
}
console.log(getFileName2("a/b/1.txt"));
console.log(getFileName2("a/b/2.html"));
//路径解析(字符串转对象)
var obj = path.parse('/home/user/dir/file.txt');
console.dir(obj);
//路径编码(对象转字符串)
var str = path.format(obj);
console.log(str);
//导入系统的模块path,用于对文件路径进行处理
var path = require("path");

//格式化文件路径
var pathString = "./a//b/c/../d";
var str = path.normalize(pathString);
console.log(str);

//文件路径拼接,并规范化输出路径
var str = path.join("./","/a","//b","c","../","d");
console.log(str);

//__dirname:获取当前目录的绝对路径
console.log(__dirname);
var str = path.join(__dirname,"01-info.js");
console.log(str);

//判断是否是绝对路径
//注:判断以路径的开头为准,以斜杠开头的都是绝对路径
var result = path.isAbsolute('./a/b');
console.log(result);
var result = path.isAbsolute('../a/b');
console.log(result);
var result = path.isAbsolute('a/b');
console.log(result);
var result = path.isAbsolute('/a/b');
console.log(result);
var result = path.isAbsolute('/a/../b');
console.log(result);

//把相对路径转换成绝对路径
//1.默认以根目录作为起点
var str = path.resolve("a/b");
console.log(str);
var str = path.resolve("01-info.js");
console.log(str);
var str = path.resolve("/a");
console.log(str);
var str = path.resolve("./a");
console.log(str);
var str = path.resolve("../a");
console.log(str);
//2.以指定的路径开始
var str = path.resolve("/a","b");
console.log(str);
var str = path.resolve("a","b");
console.log(str);

//获取从 绝对路径1到绝对路径2 的相对路径
var str = path.relative("/a/b/c","/a/d/e");
console.log(str);

//获取当前文件所在的目录
var str = path.dirname();
console.log(str);

var str = path.dirname("a");
console.log(str);

var str = path.dirname("/a");
console.log(str);

var str = path.dirname("/a/b/c/d.txt");
console.log(str);

//获取路径的最后一部分
var str = path.basename("/a/b/c/d.txt");
console.log(str);

var str = path.basename("/a/b/c/index.html");
console.log(str);
var arr = str.split(".");
console.log(arr[0]);
//指定文件后缀,来获取文件名
var str = path.basename("/a/b/c/1.2.3.index.html",".html");
console.log(str);
//获取文件的后缀名(扩展名)
var str = path.extname("/a/b/c/1.2.3.index.html");
console.log(str);

//练习:写一个函数,提供文件路径,返回获取的文件名

function getFileName(pathString){
    return path.basename(pathString,path.extname(pathString));
}
console.log(getFileName("a/b/1.txt"));
console.log(getFileName("a/b/2.html"));

function getFileName2(pathString) {
    return path.parse(pathString).name;
}
console.log(getFileName2("a/b/1.txt"));
console.log(getFileName2("a/b/2.html"));

//路径解析(字符串转对象)
var obj = path.parse('/home/user/dir/file.txt');
console.dir(obj);

//路径编码(对象转字符串)
var str = path.format(obj);
console.log(str);

NodeJs之URL模块

//导入url模块
var url = require("url");
var urlString = "http://www.baidu.com/a/b";
//url的解析
var obj = url.parse(urlString);
console.log(obj);
var urlString = "http://user:[email protected]:8080/a/b?c=d&e=f#abc";
var obj = url.parse(urlString,true);
console.log(obj);
console.log(obj.protocol);//协议,http:
console.log(obj.slashes);//协议后是否有双斜杠,true
console.log(obj.auth);//认证或授权,user:password
console.log(obj.host);//主机名(包含端口号) www.baidu.com:8080
console.log(obj.port);//端口号,8080
console.log(obj.hostname);//主机名 www.baidu.com
console.log(obj.hash);//锚点名称,#abc
console.log(obj.search);//查询的内容(以?开头),?c=d&e=f
console.log(obj.query);//查询内容, c=d&e=f ,当parse的第二个参宿为true时,会将query解析为对象{ c: 'd', e: 'f' }
console.log(obj.pathname);//路径名, /a/b
console.log(obj.path);//把pathname和search组合起来,  /a/b?c=d&e=f
console.log(obj.href);//完整的链接地址,http://user:[email protected]:8080/a/b?c=d&e=f#abc
//当第三个参数为true时,会把路径//后的内容作为主机名
var urlString ="//foo/bar";
var obj = url.parse(urlString,true,true);
console.log(obj);
//url的编码
var obj = {
    protocol: "http:",
    host: "127.0.0.1:8080",
    pathname: "/a/b",
    search: "c=d"
}
var str = url.format(obj);
console.log(str);
//路径修改
//url.resolve(原路径,修改路径);
var str = url.resolve("/one/two/three","four");
console.log(str);
var str = url.resolve("/one/two/three","/four");
console.log(str);
var str = url.resolve("http://www.baidu.com","/one");
console.log(str);
//导入url模块
var url = require("url");

var urlString = "http://www.baidu.com/a/b";

//url的解析
var obj = url.parse(urlString);
console.log(obj);

var urlString = "http://user:[email protected]:8080/a/b?c=d&e=f#abc";
var obj = url.parse(urlString,true);
console.log(obj);
console.log(obj.protocol);//协议,http:
console.log(obj.slashes);//协议后是否有双斜杠,true
console.log(obj.auth);//认证或授权,user:password
console.log(obj.host);//主机名(包含端口号) www.baidu.com:8080
console.log(obj.port);//端口号,8080
console.log(obj.hostname);//主机名 www.baidu.com
console.log(obj.hash);//锚点名称,#abc
console.log(obj.search);//查询的内容(以?开头),?c=d&e=f
console.log(obj.query);//查询内容, c=d&e=f ,当parse的第二个参宿为true时,会将query解析为对象{ c: 'd', e: 'f' }
console.log(obj.pathname);//路径名, /a/b
console.log(obj.path);//把pathname和search组合起来,  /a/b?c=d&e=f
console.log(obj.href);//完整的链接地址,http://user:[email protected]:8080/a/b?c=d&e=f#abc

//当第三个参数为true时,会把路径//后的内容作为主机名
var urlString ="//foo/bar";
var obj = url.parse(urlString,true,true);
console.log(obj);

//url的编码
var obj = {
    protocol: "http:",
    host: "127.0.0.1:8080",
    pathname: "/a/b",
    search: "c=d"
}

var str = url.format(obj);
console.log(str);

//路径修改
//url.resolve(原路径,修改路径);
var str = url.resolve("/one/two/three","four");
console.log(str);

var str = url.resolve("/one/two/three","/four");
console.log(str);

var str = url.resolve("http://www.baidu.com","/one");
console.log(str);

NodeJs之util模块

//导入util模块
var util = require("util");
function Person(name,age){
    this.name = name;
    this.age = age;
    this.play = function(){
        console.log("玩");
    }
}
Person.prototype.sayHi = function () {
    console.log("hi");
}
function Girl(name,age,gender) {
    Person.call(this,name,age);
    this.gender = gender;
}
//util.inherits(子类,父类),只能继承原型上的方法
util.inherits(Girl,Person);
var girl = new Girl("熊爱华",28,"女");
girl.sayHi();
girl.play();
//打印对象
console.log(girl.name);
console.log(girl.age);
console.log(girl.gender);
//"我叫小花,今年18啦,性别女"
console.log("我叫"+girl.name+",今年"+girl.age+"啦,性别"+girl.gender);
console.log("我叫%s,今年%d岁啦,性别%s",girl.name,girl.age,girl.gender);
//util.inspect(对象),把对象转换成字符串
console.log(girl);
//第二个参数,是否显示不可枚举的属性
console.log(util.inspect(girl,true));
//第三个参数,格式化对象时,递归的层数
console.log(util.inspect(girl, true, 1));
//第四个参数,是否显示颜色
console.log(util.inspect(girl, true, 1,true));
//类型判断
console.log(typeof 123);
console.log(typeof '123');
console.log(typeof true);
console.log(typeof []);
console.log(typeof {});
console.log(typeof /\d/);
console.log(typeof function () {});
//借助工具模块判断
console.log(util.isArray([]));
console.log(util.isDate(new Date()));
console.log(util.isRegExp(/\d/));
//导入util模块
var util = require("util");
function Person(name,age){
    this.name = name;
    this.age = age;
    this.play = function(){
        console.log("玩");
    }
}
Person.prototype.sayHi = function () {
    console.log("hi");
}
function Girl(name,age,gender) {
    Person.call(this,name,age);
    this.gender = gender;
}

//util.inherits(子类,父类),只能继承原型上的方法
util.inherits(Girl,Person);

var girl = new Girl("熊爱华",28,"女");
girl.sayHi();
girl.play();

//打印对象
console.log(girl.name);
console.log(girl.age);
console.log(girl.gender);
//"我叫小花,今年18啦,性别女"
console.log("我叫"+girl.name+",今年"+girl.age+"啦,性别"+girl.gender);
console.log("我叫%s,今年%d岁啦,性别%s",girl.name,girl.age,girl.gender);

//util.inspect(对象),把对象转换成字符串
console.log(girl);
//第二个参数,是否显示不可枚举的属性
console.log(util.inspect(girl,true));
//第三个参数,格式化对象时,递归的层数
console.log(util.inspect(girl, true, 1));
//第四个参数,是否显示颜色
console.log(util.inspect(girl, true, 1,true));
//类型判断
console.log(typeof 123);
console.log(typeof '123');
console.log(typeof true);
console.log(typeof []);
console.log(typeof {});
console.log(typeof /\d/);
console.log(typeof function () {});
//借助工具模块判断
console.log(util.isArray([]));
console.log(util.isDate(new Date()));
console.log(util.isRegExp(/\d/));

NodeJs之event模块

//导入events模块
var events = require("events");
//事件:观察者模式
var eventEmitter = new events.EventEmitter;//事件监听器
//注册事件
eventEmitter.on("abc",function () {
    console.log("执行事件abc");
});
eventEmitter.addListener("cba",function () {
    console.log("执行事件cba");
});
eventEmitter.on("hi",function (name) {
    console.log("hi" + name);
});
eventEmitter.once("only",function () {
    console.log("执行only");
});
//触发事件
eventEmitter.emit("abc");
eventEmitter.emit("abc");
eventEmitter.emit("cba");
eventEmitter.emit("hi",' 大龙');
eventEmitter.emit("only");
eventEmitter.emit("only");
//移除事件
function demo() {
    console.log("demo")
}
eventEmitter.addListener("demo",demo);
eventEmitter.emit("demo");
eventEmitter.removeListener("demo",demo);
//移除后执行,没有响应
eventEmitter.emit("demo");
//移除所有事件
eventEmitter.removeAllListeners("abc");
eventEmitter.emit("abc");
//设置最大的监听数量
eventEmitter.setMaxListeners(2);
eventEmitter.on("hello",function () {
    console.log("hello");
});
eventEmitter.on("hello",function () {
    console.log("hello2");
});
eventEmitter.on("hello",function () {
    console.log("hello3");
});
eventEmitter.emit("hello");
//导入events模块
var events = require("events");
//事件:观察者模式

var eventEmitter = new events.EventEmitter;//事件监听器

//注册事件
eventEmitter.on("abc",function () {
    console.log("执行事件abc");
});
eventEmitter.addListener("cba",function () {
    console.log("执行事件cba");
});
eventEmitter.on("hi",function (name) {
    console.log("hi" + name);
});
eventEmitter.once("only",function () {
    console.log("执行only");
});
//触发事件
eventEmitter.emit("abc");
eventEmitter.emit("abc");
eventEmitter.emit("cba");
eventEmitter.emit("hi",' 大龙');
eventEmitter.emit("only");
eventEmitter.emit("only");

//移除事件
function demo() {
    console.log("demo")
}
eventEmitter.addListener("demo",demo);
eventEmitter.emit("demo");
eventEmitter.removeListener("demo",demo);
//移除后执行,没有响应
eventEmitter.emit("demo");
//移除所有事件
eventEmitter.removeAllListeners("abc");
eventEmitter.emit("abc");

//设置最大的监听数量
eventEmitter.setMaxListeners(2);
eventEmitter.on("hello",function () {
    console.log("hello");
});
eventEmitter.on("hello",function () {
    console.log("hello2");
});
eventEmitter.on("hello",function () {
    console.log("hello3");
});
eventEmitter.emit("hello");

events-example(事件例子):

var events = require("events");
var util = require("util");
//女孩类
function Girl() { 
}
//女孩类继承事件类(让女孩具备事件监听的方法)
util.inherits(Girl,events);
//男生类
function Boy(name,callback){
    this.name = name;
    this.callback = callback;
}
var boy1 = new Boy("小龙",function () {
    console.log("小龙带着锅");
});
var boy2 = new Boy("小菜",function () {
    console.log("小菜带着菜");
});
var boy3 = new Boy("小三",function () {
    console.log("小三带着料");
});
var girl = new Girl();
girl.setMaxListeners(3);
girl.on("eat",boy1.callback);
girl.on("eat",boy2.callback);
girl.addListener("eat",boy3.callback);
girl.emit("eat");
girl.once("die",function () {
    console.log("扑街!");
});
girl.emit("die");
//可以省略EventEmitter
var event = new events;
event.on("abc",function () {
    console.log("执行abc");
});
event.emit("abc");
var events = require("events");
var util = require("util");
//女孩类
function Girl() { 
}
//女孩类继承事件类(让女孩具备事件监听的方法)
util.inherits(Girl,events);
//男生类
function Boy(name,callback){
    this.name = name;
    this.callback = callback;
}

var boy1 = new Boy("小龙",function () {
    console.log("小龙带着锅");
});
var boy2 = new Boy("小菜",function () {
    console.log("小菜带着菜");
});
var boy3 = new Boy("小三",function () {
    console.log("小三带着料");
});

var girl = new Girl();
girl.setMaxListeners(3);
girl.on("eat",boy1.callback);
girl.on("eat",boy2.callback);
girl.addListener("eat",boy3.callback);

girl.emit("eat");

girl.once("die",function () {
    console.log("扑街!");
});
girl.emit("die");

//可以省略EventEmitter
var event = new events;
event.on("abc",function () {
    console.log("执行abc");
});
event.emit("abc");

你可能感兴趣的:(【NodeJs】)