开心菜鸟系列学习笔记--------初探Nodejs(了解篇)
一Node.js开始学习了!
1) 输出hellow worlds
a.建一个js文件 hello.js 写 console.info('hellow world !!!');
进入终端 cd node 目录 然后 node d:/nodejs/www/hello.js 回车
b. node -e "console.info('hello word !!')"
c.使用node的REPL模式
node
console.info('hello world ');
CTRL+C退出repl模式
2)简单的了解一下,node.js运行模式。
Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。
Node.js 在什么时候会进入事件循环呢?答案是 Node.js 程序由事件循环开始,到事件循
环结束,所有的逻辑都是事件的回调函数,所以 Node.js 始终在事件循环中,程序入口就是
事件循环第一个事件的回调函数。事件的回调函数在执行的过程中,可能会发出 I/O 请求或
直接发射(emit )事件,执行完毕后再返回事件循环,事件循环会检查事件队列中有没有未
处理的事件,直到程序结束。
3)阻塞模式:
什么是阻塞(block)呢?线程在执行中如果遇到磁盘读写或网络通信(统称为 I/O 操作),
通常要耗费较长的时间,这时操作系统会剥夺这个线程的 CPU 控制权,使其暂停执行,同
时将资源让给其他的工作线程,这种线程调度方式称为 阻塞。当 I/O 操作完毕时,操作系统
将这个线程的阻塞状态解除,恢复其对CPU 的控制权,令其继续执行。这种 I/O 模式就是通
常的同步式 I/O (Synchronous I/O )或阻塞式 I/O (Blocking I/O)。
4)异步io/非阻塞io
异步式 I/O (Asynchronous I/O)或非阻塞式 I/O (Non-blocking I/O)则针对
所有 I/O 操作不采用阻塞的策略。当线程遇到 I/O 操作时,不会以阻塞的方式等待 I/O 操作
的完成或数据的返回,而只是将 I/O 请求发送给操作系统,继续执行下一条语句。当操作
系统完成 I/O 操作时,以事件的形式通知执行 I/O 操作的线程,线程会在特定时候处理这个
事件。为了处理异步 I/O ,线程必须有 事件循环,不断地检查有没有未处理的事件,依次予
以处理。
5)模块与包的管理:
Node.js 提供了 require 函数来调用其他模块,而且模块都是基于文件的,机制十分简单。
Node.js 提供了 exports 和 require 两个对象,
其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。
例1:
//module.js
var name;
exports.setName = function (thyName) {
name = thyName;
};
exports.sayHello = function () {
console.log('Hello ' + name);
};
在同一目录下创建 getmodule.js ,内容是:
//getmodule.js
var myModule = require('./module');
myModule.setName('BYVoid');
myModule.sayHello();
例2:
有时候我们只是想把一个对象封装到模块中,例如:
//hello.js
function Hello() {
var name;
this.setName = function (thyName) {
name = thyName;
};
this.sayHello = function () {
console.log('Hello ' + name);
};
};
module.exports = Hello;
//gethello.js
var Hello = require('./hello');
hello = new Hello();
hello.setName('BYVoid');
hello.sayHello();
事实上,exports 本身仅仅是一个普通的空对象,即 {} ,它专门用来声明接口,本质上是通过它为模块闭包的内部建立了一个有限的访问接口。
Node.js 的包是一个目录,其中包含一个 JSON 格式的包说明文件 package.json 。严格符
合 CommonJS 规范的包应该具备以下特征:
package.json 必须在包的顶层目录下;
二进制文件应该在 bin 目录下;
JavaScript 代码应该在 lib 目录下;
文档应该在 doc 目录下;
单元测试应该在 test 目录下。
6) http请求:
a.连接:
var http = require('http');
//创建服务
/*
* @param request 请求
* @param response 响应
*/
http.createServer(function(request,response){
//head头
response.writeHead(200,{'Content-Type':'text/html'});
response.write('<h1>this is song xiuxuan </h1>');
//结束
response.end('<p>hellow world</p>');
}).listen(8080);
console.info('HTTP server is listening at port 8080');
b.由于开启了8080事件监听,node.js的进程是不会断开的,也就是说修改代码后不会立即看到结果.
所以要安装一个supervisor热布署:
D:\nodejs>npm install -g supervisor
npm http GET https://registry.npmjs.org/supervisor
npm http 200 https://registry.npmjs.org/supervisor
npm http GET https://registry.npmjs.org/supervisor/-/supervisor-0.5.5.tgz
npm http 200 https://registry.npmjs.org/supervisor/-/supervisor-0.5.5.tgz
C:\Users\y400\AppData\Roaming\npm\node-supervisor -> C:\Users\y400\AppData\Roami
ng\npm\node_modules\supervisor\lib\cli-wrapper.js
C:\Users\y400\AppData\Roaming\npm\supervisor -> C:\Users\y400\AppData\Roaming\np
m\node_modules\supervisor\lib\cli-wrapper.js
supervisor@0.5.5 C:\Users\y400\AppData\Roaming\npm\node_modules\supervisor
开心菜鸟系列学习笔记--------初探Nodejs(了解篇)的更多相关文章
- 开心菜鸟系列学习笔记------javascript(5)
一.this的关系 1)全局代码中的this 2)函数代码中的this在函数代码中使用this时很有趣,这种情况很难且会导致很多问题. 这种类型的代码中,this值的首要特点(或许是最主要 ...
- 开心菜鸟系列学习笔记-------javascript(3)
一.原型链: 1)Object 是一个属性的集合,并且都拥有一个单独的原型对象.,这个原型对象object可以是一个object或者null值 2)不过一般来说,我们会使用__内部属性名__下 ...
- 开心菜鸟系列学习笔记------------javascript(6)
一.作用域链 1)函数的生命周期: 函数的生命周期分为创建和激活阶段(调用时),让我们详细研究它. 作用域链与一个执行上下文相关,变量 ...
- 开心菜鸟系列学习笔记------javascript(4)
一.全局上下文中的变量对象: 1)全局对象(Global object) 是在进入任何执行上下文之前就已经创建了的对象:这个对象只存在一份,它的属性在程序中任何地方都可以访问,全局对象的 ...
- 开心学习系列学习笔记-----nodejs缺点
不支持故障恢复 不知你是否在调试的过程中注意,当程序有错误发生时,整个进程就会结束,需要重 新在终端中启动服务器.这一点在开发中无可厚非,但在产品环境下就是严重的问题 了,因为一旦用户访问时触 ...
- 开心菜鸟系列----函数作用域(javascript入门篇)
1 <!DOCTYPE html> 2 <html> 3 <script src="./jquery-1.7.2.js"></ ...
- 开心菜鸟系列----变量的解读(javascript入门篇)
console.info( console.info(window['weiwu']) console.info(window. ...
- 进阶之初探nodeJS
一.前言 在"初探nodeJS"随笔中,我们对于node有了一个大致地了解,并在最后也通过一个示例,了解了如何快速地开启一个简单的服务器. 今儿,再次看了该篇随笔,发现该随笔理论知 ...
- MVA Universal Windows Apps系列学习笔记1
昨天晚上看了微软的Build 2015大会第一天第一场演讲,时间还挺长,足足3个小时,不过也挺震撼的.里面提到了windows 10.Microsoft edge浏览器.Azure云平台.Office ...
随机推荐
- iOS 编译64位FFMPEG
最近因为公司项目需要捣腾FFMPEG,所以看了一下资料,现在编译成功了,记录一下. 我自己发现大概有两种方式 二者共同部分 安装装yasm或者(MAcport,我用的是yasm,这里只记录yasm的) ...
- SqlServer2008 新功能:简单数据加密
一.首先要把密码字段改成 varbinary 类型. CREATE TABLE [dbo].[UserInfo]( [id] [int] IDENTITY(1,1) NOT NULL, [name] ...
- Android 网络通信框架Volley的简单使用
Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮. Volley提供的功能: JSON,图像等的异步下载: 网络请求的排序(scheduling) 网络请求的优先级处理 ...
- github进行修改
1)git status:可以让我们时刻掌握仓库当前的状态. 2)git diff [文件名]:查看改变的详细信息,显示的结果是Unix通用的diff格式. 步骤: 1.修改文件 2.通过git ad ...
- qmake使用实践:包含动态库的Qt4工程
文章来源:http://blog.csdn.net/dbzhang800/article/details/6317006 本文是qmake的一个使用练习,是半年前所学的 分析与学习Qt Solutio ...
- Cmake的install与file命令的区别
实际上他们两个可以达到一个目标(对于文件操作),但是又有本质上的区别,文档没有细看,但是一般利于项目的管理,使用install,install命令如果在cmake命令中没有指名install参数,实际 ...
- Android Fragment getActivity返回null解决
在Android开发中,如果我们用到V4包里面的Fragment,在应用被切换到后台的时候,Activity可能被回收,但是创建的所有Fragment则会被保存到Bundle里面,下面是Fragmen ...
- python字符串(移除空白,长度,索引,分割,切片,拼接,格式化输出)
常用功能: 移除空白: >>> name = "meng" >>> name 'meng' >>> name.strip() ...
- 小米路由器mini如何设置外网访问wan网站的方法
很多的玩友都在小米路由器mini上面搭建了自己的网站,有些朋友还需要设置对外网进行开放,我自己也在路由器上面实践了使用,下面与大家分享一下如何设置外网访问路由器网站的办法. 工具/原料 小米路由器mi ...
- WebApi2官网学习记录---Attribute Routing
从WebApi 1迁移到WebAPI 2要改变配置代码如下: WebApi 1: protected void Application_Start() { // WARNING - Not compa ...