nodejs与前端开发那些不得不说的事程序员饥人谷技术博客

nodejs入门介绍

2016-09-03  本文已影响380人  忽如寄

有用网址链接:
npm官网
nodejs官网
nodejs中文文档
七天学会NodeJs
ASCII码表八、十、十六进制对照表
fs.stats对象各个变量的相关说明

基础知识####

1、阻塞:线程在执行中如果遇到磁盘读写或者网络通信(统称为I/O操作),通常需要耗费较长的时间,这时操作系统会剥夺这个线程的CPU控制权,使其暂停执行,同时将资源让给其他的工作线程,这种线程调度方式称为阻塞,当I/O操作完毕时,操作系统将这个线程的阻塞状态解除,恢复其对CPU的控制权,令其继续执行。这种I/O模式就是通常的同步式I/O或阻塞式I/O
2、同步式I/O和异步式I/O的特点

一、nodejs模块####


1、在nodejs中,一般将代码合理拆分成不同的js文件中,每一个文件都是一个模块,而文件路径就是模块名。编写每个模块时,都有require、exports、module三个预定义好的变量可以使用。
2、require:require用于在当前模块中加载和使用别的模块,传入一个模块名,返回一个模块导出对象。模块名可以用使用相对路径(这是需要以./开头),也可以使用绝对路径,另外.js后缀也可以省略。此外,require可以加载和使用一个json文件

var fs=require("fs");
var my=require("./hello/me");
var data=require("./data.json");

3、exports:exports用于导出当前模块的对象,导出模块共有的方法和属性,通过require就是得到exports的导出对象

function hell0(){
    console.log("hello world");
}
exports.hello=hello;

4、module:module对象可以访问当前模块的一些方法,但最多的用处是替换当前模块的导出对象。

module.exports=function(){
     console.log("hello world")
}

5、主模块:通过命令行参数传递给nodejs来启动程序的模块就是主模块,负责调度组成整个程序的其他模块完成工作。

$ node main.js

6、二进制模块:nodejs支持使用C/C++来编写二进制模块,这个模块能使用操作系统提供的所有功能,具有无限潜力,但是对于我们这群前端(切图仔)来说编写太困难了,orz

二、代码组织与部署###


1、require支持以/或者盘符开头的绝对路径和以./开头的相对路径,这两种路径在模块之间建立了强耦合关系,一旦某个模块的位置发生变化,就会牵一发动全身,因此require支持第三种形式的路径,写法类似于foo/bar,解析规则如下:
(1)内置模块:内置模块,不做路径解析,直接返回导出对象

var fs=require("fs");
var path=require("path");

(2)node_modules目录(如果之前了解过gulp等构建工具,相信不会太陌生):这个node_modules目录用于存放模块,例如某个模块的绝对路径是home/hello/hello.js,在该模块中导入其他模块,写法为<code>require("me/first")</code>,则nodejs会依次尝试使用路径

/home/hello/node_modules/me/first
/home/node_modules/me/first
node_modules/me/first

(3)NODE_PATH环境变量
2、包:多个子模块组成的大模块称为包,此时所有的子模块在同一目录下,当包的入口模块的文件名为index.js时,加载模块时可以用目录路径代替文件路径,使得使用包看起来更有整体感。

var me=require("/home/hello/index.js");
var me=require("/home/hello");

另外,使用package.json文件时,nodejs会根据包目录下的package.json文件找到入口模块所在位置,例如package.json文件内容如下:

{
        "name"  :  "me",
        "main"  :"./lib/main.js" 
}

3、工程目录:编写一个命令行程序时,一般我们会提供命令行模式和API模式两种使用方式,并且会借助第三方包来编写代码,除了代码以外,一个完整的程序还应该要有文档和测试用例,因而,一个标准的工程目录应该像下边这样:

工程目录实例

4、NPM(了解过gulp等构建工具应该不会很陌生):随同nodejs一起安装的包管理工具,常用场景(1)用户需要使用从npm服务器下载第三方包使用(2)将自己编写的程序上传到npm服务器中供别人使用

三、文件操作####


1、相关API####

1、buffer(数据块)
(1)二进制快速入门:计算机的工作原理是操作“开”和“关”状态,因为只有这两种状态,称作为二元状态,计算机的所有东西都建立在此基础上,因此,操作二进制通常是最快的方法,buffer值是采用十六进制表示的。
(2)基本上编码的工作原理就是采用一个查找表把字符映射到对应的数字上,要把编码后的内容转换回来,计算机只要通过查找转换表,就能把数字变成字符

四、网络操作####


1、相关API####

1、URL模块
1、parse方法:接受一个url字符串对象为参数,返回一个url对象,同时还可接受另外两个参数,默认都是false,第一个一个是将查询键值对转换为对象,其他相同,

var url=require("url");
function get(urlpath){
    console.log(url.parse(urlpath));
}
get("http://www.imooc.com/video/6710");

输出如下:

parse方法输出

各个变量说明:
protocol:使用的协议
slashes:是否有协议后面的双斜杠
host:域名
port:端口,默认为80端口
hostname:主机名
hash:哈希值,(fullpage插件常用,网址#号后面的东西)
search:查询字符串(?号后面的东西)
query:键值(等号后面的东西)
pathname:访问的路径名
path:路径
href:未被解析前的完整超链接
如果修改代码如下:

var url=require("url");

function get(urlpath){
    console.log(url.parse(urlpath));
}
get("http://www.imooc.com:8080/video/6710?from=scott&course=node#1");

得到如下输出:

修改后的输出

2、format方法:接受一个url对象为参数,返回一个完整的url地址

var url=require("url");

function format(urlname){
    console.log(url.format(urlname));
}
var urlname={
    protocol:"http:",
    slashes:true,
    host:"www.me.com",
    hostname:"www.me.com",
}
format(urlname);

3、resolve方法:接受一个base url对象和一个href url对象,像浏览器那样解析,返回一个完整地址

var url=require("url");

function resolve(path1,path2){
    console.log(url.resolve(path1,path2));
}
resolve("http://me.com","1/me.html");     //return http://me.com/1/me.html 

2、http模块
用createServer方法创建一个服务器

var http=require("http");

http.createServer(function(req,res){
    res.writeHead(200,{"Content-Type":"text/plain"});
    response.end("Hello world\n");
}).listen(8080);

1、http模块的两种使用方式:作为服务器端使用时,监听http客户端请求并返回响应,作为客户端使用时,发起一个http请求,获取服务器端响应。
2、http请求本质上是一种数据流,由请求头和请求体组成


POST / HTTP/1.1
User-Agent:curl/7.26.0
Host:localhost
Accept:*/*
Content-Length:11
Content-Type:text/plain

Hello nodejs

进程管理####


1、Process:任何一个进程都有启动进程时使用的命令行参数,有标准输入输出,有运行权限,有运行状态和运行环境,可以通过Process对象感知和控制nodejs自身进程的方方面面,process不是一个内置模块,而是一个全局对象,因此在任何地方都可以使用

其他模块####


1、相关API####

1、events模块
nodejs中大部分的模块,都继承自events模块,events模块是一个简单的事件监听器模式的实现,不存在DOM数上的冒泡、捕获等行为。event中只暴露出了一个EventEmitter类,初始化一个 EventEmitter类

var me=require("events").EventEmitter;

(1)添加一个事件和监听

me.on("go",function(p){
    console.log("me is a"+p)
});

(2)利用on方法添加事件和监听时,返回emitter方便链式调用,可以为一个事件添加多个监听

me.on("go",function(p){
    console.log("me is other"+P)
});

(4)emit方法触发事件,引发函数执行

me.emit("go","event")

(5)移除事件:removeListener方法用来移除单个监听,但是此时监听的回调函数应该在添加监听外写成一个函数形式

function my(p){
    console.log("me is other "+"p")
}
me.on("go",my);
me.removeListener("go",my);

removeAllListeners方法可以移除所有监听,当有参数时是移除对应事件的监听,无参数时是移除所有事件的所有监听

me.removeAllListeners("go");

(6)修改监听数:一个EventEmitter对象的一个事件默认最多可以有10个监听,超过这个数会出现报警,但是可以通过setMaxListeners修改这个数值

me.setMaxListeners(12);

(7)统计总的监听数:listeners方法

me.listeners("go").length;

类方法EventEmitter.listenerCount

EventEmitter.listenerCount(me,"go");
上一篇下一篇

猜你喜欢

热点阅读