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
多个模块组合在一起,就形成了包(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)
模块: 把一些通用的代码写到不同的 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.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
注意: 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);
//导入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);
//导入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/));
//导入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");