Node是用c++语言开发,能运行javascript语言的环境。

使用的时候格式为node helloworld.js,helloword.js为服务器端或者系统级端的javascript代码。

Node有很多特性,这里不再一一展开。先用node创建一个http服务器监听固定端口:

var http = require('http');

http.createServer(function (req, res) {

res.writeHead(200, {'Content-Type': 'text/plain'});

res.end('Hello World\n');

}).listen(80, "127.0.0.1");

简单解释:创建一个简单的http服务器,箭筒80端口。对于任何的http请求,服务器返回头部状态码为200,content-type值为text/plain的hello world的文字响应。

简单来说,此时用浏览器访问指定端口,会有相应的响应。

在createserver函数的参数中有一个回调函数,当有http请求的时候,node就调用这个回调函数处理请求并实现响应。

在介绍javascript闭包特性的时候,有这样一段代码应当引起重视:(另外关于函数的闭包,之后会更深入的研究,谨记!)

var hostRequest = http.request(requestOptions,function(response) {

var responseHTML ='';

response.on('data', function (chunk) {

responseHTML = responseHTML + chunk;

});

response.on('end',function(){

console.log(responseHTML);

// do something useful

});

});

简单解释:上面的代码要用end事件处理responseHTML变量,根据函数闭包的特性,可以在两个回调函数之外定义responseHTML变量然后再data事件中根据需要修改这个变量的值,并且送到end事件中执行。

Node.js的模块机制:

Javascript的缺陷:

没有模块系统;没有原生的支持密闭作用域或依赖管理。

没有标准库;除了一些核心库之外,没有文件系统的API。

没有标准接口;没有数据库的统一接口;

没有包管理系统;不能自动加载和安装依赖。

于是有了CommonJS规范的出现。于是node.js就成了这种规范的实现者。

Node.js用require机制可以实现对文件的调用:在require这个文件之后,定义在exports对象上的方法便可以随意调用。

举例如下:

var PI = Math.PI;

exports.area = function (r) {

return PI * r * r;

};

exports.circumference = function (r) {

return 2 * PI * r;

};

这个文件存储为xx.js文件,在app.js文件中用require调用:var circle = require('./xx.js');,之后就可以使用xx.js中的以exports开头的函数。

举例如下(app.js):

var circle = require('./xx. js');

console.log( 'The area of a circle of radius 4 is ' + circle.area(4));

最后一句中的circle.area(4)就是在调用事先在xx.js中定义的

exports.area = function (r) {

return PI * r * r;

};

这个函数。最后采用字符串的拼接完成The area of a circle of radius 4 is 50.26548245743669的显示。

这里有一个问题:为什么我没在app.js中定义require这个变量,但是能正常使用不报错?

原因我们从输入node app这个口令后说起。
在你砸下enter之后,编译器开始包装这个app.js这个文件,包装之后的这个文件变成:

(function (exports, require, module,
__filename, __dirname) {

var circle = require('./app.js');

console.log('The area of a circle of radius
4 is ' + circle.area(4));

});

原来的两句变成了三句,成为了一个函数,并且还有五个参数。

这段包装好之后的代码有一个类似eval的工具执行,返回一个具体的function对象,最后传入module对象的这五个参数(或方法),作为实参并执行。

所以,在app.js中并没有定义exports,但是这个方法还是存在的原因。在这个文件中,可以继续用require来引用新的模块执行新的功能,事实上require调用的是load方法。

load方法在载入、编译、缓存了module后,返回module的exports对象。这就是xx.js文件中只有定义在exports对象上的方法才能被外部调用的原因。(待续)

(还请各位指点一二,共同进步^_^)

Node.js学习笔记(1)的更多相关文章

  1. 一点感悟:《Node.js学习笔记》star数突破1000+

    写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...

  2. Node.js学习笔记(3):NPM简明教程

    Node.js学习笔记(3):NPM简明教程 NPM常用操作 更新NPM版本 npm install npm -g -g,表示全局安装.我们可以指定更新版本,只需要在后面填上@版本号即可,也可以输入@ ...

  3. 系列文章--Node.js学习笔记系列

    Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...

  4. Node.js学习笔记(2):基本模块

    Node.js学习笔记(2):基本模块 模块 引入模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在No ...

  5. Node.js学习笔记(1):Node.js快速开始

    Node.js学习笔记(1):Node.js快速开始 Node.js的安装 下载 官方网址:https://nodejs.org/en/ 说明: 在Windows上安装时务必选择全部组件,包括勾选Ad ...

  6. Node.js学习笔记(4):Yarn简明教程

    Node.js学习笔记(4):Yarn简明教程. 引入Yarn NPM是常用的包管理工具,现在我们引入是新一代的包管理工具Yarn.其具有快速.安全.可靠的特点. 安装方式 使用npm工具安装yarn ...

  7. Node.js学习笔记(一)

    1.回调函数 node是一个异步事件驱动的平台,所以在代码中我们经常需要使用回调函数. 例: setTimeout(function(){ console.log('callback is calle ...

  8. Node.js学习笔记(一):快速开始

    最近接了一个node项目,虽然最后顺利完成了,但是由于第一次实战,整个过程是赶出来的,许多地方一知半解.现在项目结束了,就静下心来系统地学一学,理一理,读书不忘拿笔,既然读书了,当然就要记点东西.一方 ...

  9. Node.js学习笔记(一)基础介绍

    什么是Node.js 官网介绍: Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...

  10. node.js学习笔记(三)——事件循环

    要理解事件循环,首先要理解事件驱动编程(Event Driven Programming).它出现在1960年.如今,事件驱动编程在UI编程中大量使用.JavaScript的一个主要用途是与DOM交互 ...

随机推荐

  1. PowerDesigner 表视图修改

    PowerDesigner中Table视图同时显示Code和Name,像下图这样的效果: 实现方法:Tools-Display Preference 转自:http://www.shaoqun.com ...

  2. Windows 10 Edge浏览器、照片查看程序关闭“平滑滚动”

    升级到10后,这两个常用软件的“平滑滚动”功能,个人感觉体验有点不好,特别是图片这个自带程序,看了几十张图后就有点头晕了,所以把它关闭为好: 控制面板\系统和安全\系统\高级系统设置\高级\性能\设置 ...

  3. JPA一对多和多对一关系

    1-m:多的一方为关系维护端,关系维护端负责外键纪录的更新,关系被维护端没有权力更新外键纪录. 维护端注解 @OneToMany(cascade = { CascadeType.PERSIST, Ca ...

  4. 电子图书的编目和OPAC揭示

    摘  要  步入数字图书馆时代,电子资源日益增多,尤其在高校图书馆更加迅猛,怎样将图书馆的电子资源尽可能地整合在OPAC系统的检索功能里,以便更加简便.直观地利用,电子图书的编目已成为重要研究课题.本 ...

  5. Oracle中decode方法的作用

    DECODE(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值) 该函数含义如下: IF 条件=值1 THEN    RETURN (翻译值1) ELSIF 条件=值2 THEN   ...

  6. C++的优秀特性3:构造函数和析构函数

    (转载请注明原创于潘多拉盒子) 构造函数和析构函数是C++中再熟悉不过的概念了,几乎每个了解一点C++的人都知道这两个概念是什么意思.一个对象的全部生命期中构造函数和析构函数执行的时机如下: 1. 为 ...

  7. MON166 FAQ

    MON166: SOFTWARE RESET USING THE MONITOR QUESTION What happens when debugging using MON166 and my pr ...

  8. Java学习笔记之深入理解引用

    引言:Java中数据传递的方式,除了基本数据类型是按照值传递,其它类型全部是按照引用传递,这和C++有很大区别,但是很多网上文章都解释的不清楚,甚至是错误的,在查阅资料之后,下面整理出一个比较容易理解 ...

  9. 理解reserve与resize

    1.首先明白capacity与size的概念,capacity表示当前可以容纳多少个元素,size表示当前有多少个元素.为了避免频繁地分配内存,vector预留了一些内存.也就是说:size<= ...

  10. 搭建Spring + SpringMVC + Mybatis框架之三(整合Spring、Mybatis和Spring MVC)

    整合Spring和SpringMVC 之前已经整合了spring和mybatis,现在在此基础上整合SSM. 项目目录: 思路:SpringMVC的配置文件独立,然后在web.xml中配置整合. (1 ...