初识Node.js


Posted in Javascript onMarch 20, 2015

先来简单介绍nodeJS

我们知道JavaScript是运行在浏览器中的,浏览器为它提供了一个上下文(context),从而让JavaScript得以解析执行。

nodeJS其实可以这么理解,它是另外一种上下文,它允许在后端(脱离浏览器环境)解析执行JavaScript代码。

因为它使用了Google的V8虚拟机(Google的Chrome浏览器使用的上下文环境),所以代码可以同理德被执行。

nodeJS除了可以在浏览器端显示结果之外,还可以直接在控制台输出。

nodeJS的特点

nodeJS主要有非阻塞、基于事件驱动、单进程这几个特点。NodeJS的作者说,他创造NodeJS的目的是为了实现高性能Web服务器,他首先看重的是事件机制和异步IO模型的优越性,而不是JS它更适用于轻量、可伸缩,适于实时数据交互应用。nodeJS内置了很多对象,比如http,fs等,我们可以用它搭建我们的HTTP服务器,在服务器上进行开发。

安装

对于我自己来说,很少进linux去干活,所以目前只有Windows端的安装方式。Linux的安装方式自己网上搜一搜吧..我贴一下别人的

先安装依赖包
 sudo apt-get install g++ curl libssl-dev apache2-utils 
sudo apt-get install git-core
then
git clone git://github.com/joyent/node.git  

cd node

./configure

make  

sudo make install

听说要注意Python版本的问题,建议2.6+的版本,低版本会出现Node安装错误,

查询Python版本可在终端中输入:pyhton -v

Windows下

安装很简单,上官网,把最新版本的msi文件下载下来,直接安装~可以修改路径。

初识Node.js

一路下去无阻碍

初识Node.js

安装成功之后最新版本的默认已经帮你放进系统路径里边去了,不必管了。

之后可以到开始菜单里边找到nodeJS打开其命令行进入,默认是进入C盘的,一般还是切换到安装路径所在盘,比如我的是E盘

初识Node.js初识Node.js

看nodeJS是否安装成功,查看其版本号 node -v

然后简单地测试一下,先输入node命令,然后直接控制台输入console.log("hello");

因为console.log方法实际上是有返回值的,这里没有给他返回,所以第二个就是undefined

初识Node.js

再来测试一下,这次我们要看见 Hello World !

在安装路径下(比如我是E:\Program Files\nodejs)新建一个main.js 文件,输入

var http = require('http');
http.createServer(function (req, res) {

 res.writeHead(200, {'Content-Type': 'text/plain'});
 
 res.end('Hello World\n');

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

console.log('Server running at http://127.0.0.1:3000/');

然后在里边输入 node main.js 执行(一般node里边退出就是按一次或两次 Ctrl+C ) ,这时服务器就已经搭建好了~
浏览器中输入其中的地址:http://localhost:3000

我们的Hello World 出来了~

初识Node.js

然后先来解释一下这小段代码。

var http = require('http');上面说到了,http是nodeJS里边内置的对象模块,我们使用require这种方式把它引进来(对象模块一般就是这么引入的,我们也可以自己建立自己的模块,然后将它们引入,之后再提到)。

然后http现在这个对象模块有一个方法是,http.createServer(),这个方法创建一个服务之后再监听一个地址:http.createServer().listen(port,ip)

从而搭建了一个服务器。

createServer()里边有一个匿名函数,主要就是用来处理相关信息了。req是请求request,res是回复response。req一般用于请求阶段的解析处理等,比如常见的get中的地址栏url字符的处理。res一般用于收到请求后相应的操作,比如写响应头响应体渲染页面等等。

在这里,res.writeHead(200, {'Content-Type': 'text/plain'});就相当于写了个响应头,res.end('Hello World\n');相当于写了个响应体。

nodeJS提供了很多内置对象方法,比如http,fs,EventEmitter,url等等

这些东西的使用建议参考官方文档

或者taobao建立的平台CNodejs,去里边逛逛吧

还有这个7天学会nodeJS

基本的HTTP服务器搭建就是这样了,下面介绍node强大的工具npm(node packages manager,包管理工具)。

它主要用于管理我们的包,下载安装包或者卸载包等等。

旧版本的node需要自个去下载安装,不过新版本的已经集成了。所以直接在这里输入npm -v 查看它的版本吧~

初识Node.js

npm安装方式一般说来有两种,全局或者本地

好那我们就先来体验下,装个express框架吧。

(express.js是nodejs的一个MVC开发框架,并且支持jade,ejs等多种模板)

我们可以使用两种方式安装:

全局安装:npm install --g express .(我发现--g或者-g皆可)这种方式会把包安装到全局路径里边,一般是C盘的npm/node_modules/下边

哇哦....

初识Node.js

不要在意那些错误..

接下来用我想express -V(大写的)查看它的版本吧

初识Node.js

有些朋友可能会遇到错误,这里贴个某网友的的~

初识Node.js

解决方式如其所说:新版本将命令工具分家了,所以先另外再安装它npm install -g express-generator

初识Node.js

我说过了,不要在意上面那些细节..O_O

好了,现在我们来试试express ?

还是那个main.js 我们把它改成这样:

var express = require("express");
//var app = express.createServer(); // 在新版本已经不兼容了,所以直接用下面那个
var app = express(); // 或者直接 var app= require("express")();
var port = 3000;
var ip = "127.0.0.1";
app.listen(port,ip);// ip 这个参数可不写,默认本地

app.get('/',function(req,res){ 
  res.send("Hello World\n");
});

console.log("start express server\n");

如上所示,新版本可能会报错没那个方法
初识Node.js

express封装了http,所以可以直接使用它定义的方法了

然后浏览器输入http://localhost:3000/ 又是

初识Node.js

然后再来简单介绍上面的代码。其余都不必说了,说一下app.get() 其实这就是一个路由处理。

好那我们来试试路由的处理~

var express = require("express");
//var app = express.createServer(); // 在新版本已经不兼容了,所以直接用下面那个
var app = express(); // 或者直接 var app= require("express")();
var port = 3000;
var ip = "127.0.0.1";
app.listen(port,ip);// ip 这个参数可不写,默认本地

app.get('/',function(req,res){ 
  res.send("Hello World\n");
});
app.get('/one',function(req,res){  // 或者“/one/
  res.send("one\n");
});
app.get('/user',function(req,res){  //或者 "/user/"
  res.send("user\n");
});
app.get('/user/:id',function(req,res){  //或者 "/user/"
  res.send("user: "+req.params.id);
});
console.log("start express server\n");

如上所示,get的第一个参数就是路径地址,第二个参数就是回调函数。

你使用不同的地址路径,就可以进行不同的操作了。

比如浏览器地址的不同可路由:

初识Node.js初识Node.js

初识Node.js初识Node.js

上头那个user/11中的11就被当做user的参数id值。我们可以通过req.params这个全局方法来获取相应的参数值 req.params.id

对于express,其实有一种更普遍的方法,那就是直接用它来创建一个项目:

比如,我要创建项目express_test 就输入

express -e express_test

初识Node.js

好了,项目创建成功,看一下它的结构吧~

初识Node.js

项目创建成功之后,生成四个文件夹,主文件app.js与配置信息文件packetage.json

bin是项目的启动文件,配置以什么方式启动项目,默认 npm start

public是项目的静态文件,放置js css img等文件

routes是项目的路由信息文件,控制地址路由

views是视图文件,放置模板文件ejs或jade等(其实就相当于html形式文件啦~)

express这样的MVC框架模式,是一个Web项目的基本构成。

更细的部分先不考虑,我们先来简单地启动吧~

初识Node.js

看到没有,第一步出错了,因为它不知道是什么项目,所以要先进入你想要启动的项目。cd express_test

然后又出错了是怎么回事?

看到了吧,它找不到所需模块,所以一般我们创建新项目的时候也要先给他安装相应的模块。

我们直接使用npm install 就行了,它会自动检测package.json文件下载安装相应的模块

初识Node.js

好吧,那就启动吧~

初识Node.js

ok,启动成功,浏览器输入地址查看一下~

默认端口是3000,可以到bin里边的www文件查看,或者自己修改吧~

初识Node.js

初识Node.js

哇哦~成功了!简单的express项目就是这样子了..

express模块就先简单地介绍到这来。更多的express后面会继续讲一讲~

最后随手谈一下上面提到的require相关的知识

编写稍大一点的程序时一般都会将代码模块化。在NodeJS中,一般将代码合理拆分到不同的JS文件中,每一个文件就是一个模块,而文件路径就是模块名。

在编写每个模块时,都有require、exports、module三个预先定义好的变量可供使用。

require函数用于在当前模块中加载和使用别的模块,传入一个模块名,返回一个模块导出对象。

模块名可使用相对路径(以./开头),或者是绝对路径(以/或C:之类的盘符开头),模块名中的.js扩展名可以省略。

举个例子:

var express = require("express");
var func1 = require("./func1");// 是与当前main.js同路径下的func1.js模块
var func2 = require("../nodejs/func2");// func2.js则位于与main.js父文件同路径下的

exports对象是当前模块的导出对象,用于导出模块公有方法和属性。

别的模块通过require函数使用当前模块时得到的就是当前模块的exports对象。

比如上面提到的func1.js

我们可以这样写代码然后导出来:

exports.func1 = function(){ 
  console.log("This is func1");
};
/*或者这样
function func1(){ 
  console.log("This is func1");
}
exports.func1 = func1;
*/

module对象可以访问到当前模块的一些相关信息,但最多的用途是替换当前模块的导出对象。

例如模块导出对象默认是一个普通对象,如果想改成一个函数的话,可以使用以下方式。

module.exports = function () { 
   console.log('Hello World!'); 
};

这样一来,模块默认导出对象被替换为一个函数。我们在main.js里边就可以直接 var app = require("./func1")(); 操作了

还可以导出一个对象的形式:

//在func1.js里边这样
module.exports = function(name, age) { 
this.name = name; 
this.age = age; 
this.about = function() { 
console.log(this.name +' is '+ this.age +' years old'); 
}; 
}; 
//然后在main.js里边这样
var Func1 = require('./func1.js'); 
var r = new Func1('xiaoming', 12); 
r.about(); // xiaoming is 12 years old

-----------好了 以上就是nodeJS的起步,有没有发现,好神奇..--------------

Javascript 相关文章推荐
lib.utf.js
Aug 21 Javascript
将函数的实际参数转换成数组的方法
Jan 25 Javascript
25个非常棒的jQuery滑块插件和教程小结
Sep 02 Javascript
Javascript中的回调函数和匿名函数的回调示例介绍
May 12 Javascript
javascript多行字符串的简单实现方式
May 04 Javascript
简介JavaScript中Boolean.toSource()方法的使用
Jun 05 Javascript
JS获取当前脚本文件的绝对路径
Mar 02 Javascript
浅谈JavaScript中的this指针和引用知识
Aug 05 Javascript
Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解
Mar 13 Javascript
Vue指令v-for遍历输出JavaScript数组及json对象的常见方式小结
Feb 11 Javascript
JS实现扫码枪扫描二维码功能
Jan 03 Javascript
基于angular实现树形二级表格
Oct 16 Javascript
JavaScript Sort 的一个错误用法示例
Mar 20 #Javascript
JS实现的数组全排列输出算法
Mar 19 #Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
Mar 19 #Javascript
JavaScript实现在标题栏上显示当前日期的方法
Mar 19 #Javascript
JavaScript显示当前文档最后修改日期的方法
Mar 19 #Javascript
JavaScript将一个数组插入到另一个数组的方法
Mar 19 #Javascript
JS中prototype的用法实例分析
Mar 19 #Javascript
You might like
基于JQuery制作的产品广告效果
2010/12/08 Javascript
jquery加载页面的方法(页面加载完成就执行)
2011/06/21 Javascript
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
2011/06/27 Javascript
Jquery工作常用实例 使用AJAX使网页进行异步更新
2011/07/26 Javascript
javascript 实现简单的table排序及table操作练习
2012/12/28 Javascript
javascript实现英文首字母大写
2015/04/23 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
浅谈js中的延迟执行和定时执行
2016/05/31 Javascript
jQ处理xml文件和xml字符串的方法(详解)
2016/11/22 Javascript
Vue.js系列之vue-router(上)(3)
2017/01/03 Javascript
JS跳转手机站url的若干注意事项
2017/10/18 Javascript
angular4 JavaScript内存溢出问题
2018/03/06 Javascript
JS实现统计字符串中字符出现个数及最大个数功能示例
2018/06/04 Javascript
详解Vue实战指南之依赖注入(provide/inject)
2018/11/13 Javascript
如何实现一个简易版的vuex持久化工具
2019/09/11 Javascript
用Python计算三角函数之acos()方法的使用
2015/05/15 Python
Python 利用切片从列表中取出一部分使用的方法
2019/02/01 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
2019/10/17 Python
Python3 xml.etree.ElementTree支持的XPath语法详解
2020/03/06 Python
Python实现将元组中的元素作为参数传入函数的操作
2020/06/05 Python
利用HTML5中的Canvas绘制一张笑脸的教程
2015/05/07 HTML / CSS
浅析HTML5中的 History 模式
2017/06/22 HTML / CSS
Giglio美国站:意大利奢侈品购物网
2018/02/10 全球购物
C# .NET面试题
2015/11/28 面试题
培训讲师邀请函
2014/01/10 职场文书
公司周年庆典邀请函
2014/01/12 职场文书
建筑安全标语
2014/06/07 职场文书
工作总结与自我评价
2014/09/18 职场文书
招标授权委托书样本
2014/09/23 职场文书
房屋财产继承协议书范本
2014/11/03 职场文书
电影复兴之路观后感
2015/06/02 职场文书
nginx优化的六点方法
2021/03/31 Servers
CSS3 制作的悬停缩放特效
2021/04/13 HTML / CSS
nginx结合openssl实现https的方法
2021/07/25 Servers
浅谈css实现背景颜色半透明的两种方法
2021/12/06 HTML / CSS
html中两种获取标签内的值的方法
2022/06/16 jQuery