nodejs教程之入门


Posted in NodeJs onNovember 21, 2014

前言

再不学nodeJs,我们就老了......在HTML5大浪袭来的时候,很多先辈就开始了NodeJs之旅,而那时我还在做服务器端的程序
后来转成前端,和梯队的距离已经很大了,因为我会服务器端语言,还干了很久,所以至今才开始学习NodeJs,向完整的前端前进
这次学习NodeJs的计划是:
① 1-2周学习基础知识
② 1周左右开发一个简单项目
③ 利用NodeJs开发一套用于移动端调试的工具
④ 打包相关(这个可能比较远了)

NodeJs特点

① 异步
从文件读取到网络请求,NodeJs皆以异步完成,回调函数占据重要作用,在编程模型上Node是领先的

② 事件回调
事件回调让程序变得轻巧,但是具体怎么样还是取决于程序员。但是回调函数在阅读上其实还是有一定难度的

③ 单线程
Node是单线程的,如果多线程的话,这门语言水又深了,问几句进程中的通信时很讨厌的,但线程也没有死锁等问题
但是性能相关就有问题了,因为不能利用多核;

模块机制/CommonJs

我们原来做服务器端的开发,如果没有很好的组织代码的话,后期维护非常困难,所以才会有什么MVC,什么三层架构
而现在前端的业务逻辑逐向后端靠拢,就单页应用来说,已经超过后端的程序逻辑
页面view不停的增加会带来js代码量的激增,如何很好的管理我们的前端代码成了一个问题,所以requireJs出现了......
PS:尼玛这段和nodeJs有一毛钱关系哇......
javascript是没有模块化系统的,于是就有CommonJs的提出,让js具备开发大型应用的基础

模块引用

我们如果要引用一个模块,比如数学计算相关:

var math = require('math');

模块定义

我们如果要定义自己的模块可以这样干

exports.add = function () {

  return sum;

}

如果此函数在math中定义的话,就能使用了

math.add();

模块标识

模块标识就是传递给require的参数,需要为驼峰命名,指向的是一个文件路径,这里和requireJS很类似的

模块实现

Node中模块实现分为两类,一种是系统级别的核心模块,一种是用户编写的文件模块
核心模块在编译过程被翻译成了二进制文件,Node进程启动后,一些核心的模块会直接加载进内存(文件定位、编译执行)
文件模块需要动态加载,速度相对慢一点
但是一旦加载后,那些文件便会被缓存,二次引入时候便会读取缓存文件(编译后的文件)
这里扯远一点,我们在使用underscore过程中,会编译Html形成模板函数(他真的只是一个函数),其实这个就可以做缓存
在部署项目之前保存编译过后的函数,去掉html模板文件(优化效果不知)

在node中,每个模块都是一个对象:

function Module(id, parent) {

  this.id = id;

  this.exports = {};

  //parent是关键字,不应该乱用

  this.parent = parent;

  if (parent && parent.children) {

    parent.children.push(this);

  }

  this.filename = null;

  this.loaded = false;

  this.children = [];

}

编译和执行时引入文件模块的最后一个阶段,定位到具体文件后,node会新建一个模块对象,然后根据路径载入并编译
每一个编译成功的模块都会将其文件路径作为索引缓存在Module._cache上

每个模块文件都存在require、exports、module三个变量,但是在文件中并未定义(__filename__、__dirname__ 变量也是)
其实在编译过程中,Node对javascript文件内容进行了头尾包装(相当于自定义函数传入window)

(function (exports, require, module, __filename__, __dirname__) { 

  var math = require('math');

  exports.area = function (radius) {

    return '';

  };

});

这样,模块与模块之间做了隔离,不会互相影响,这里和underscore的编译有些类似......

包与NPM

Node组织了自身的核心模块,所以第三方文件模块可以有序的编写和使用,但是在第三方模块中,模块与模块之间仍然散列在各地
相互之间不能直接引用,在模块外包和NPM则是将联系建立起来的一种机制
PS:很多模块会形成一个包,这个包的概念和java包的概念,才#程序集的概念应该相似

一个包结构解压后会形成几个文件:
① package.json 描述文件
② bin 可执行二进制目录
③ lib javascript代码目录
④ doc 文档(尼玛基本没有)
⑤ test demo

以上都是CommonJS包的规范的一些东西,但是我们稍微了解一下便可(初学嘛),NPM则需要熟练掌握,借助NPM我们可以熟练安装管理包

安装依赖包

安装依赖包是常用方法:

npm install express
执行后就会在当前目录下创建node_modules目录,然后再其下面创建express目录......
PS:express是NodeJs上流行的web开发框架,帮助我们快速开发一个web应用
安装结束后就可调用了:

var express = require('express');

结语

这段简单结束,后面我们项目实战过程逐步深化

NodeJs 相关文章推荐
nodejs开发微博实例
Mar 25 NodeJs
使用DNode实现php和nodejs之间通信的简单实例
Jul 06 NodeJs
Nodejs初级阶段之express
Nov 23 NodeJs
Nodejs如何搭建Web服务器
Mar 28 NodeJs
浅谈Nodejs应用主文件index.js
Aug 28 NodeJs
nodejs 实现钉钉ISV接入的加密解密方法
Jan 16 NodeJs
Nodejs读取文件时相对路径的正确写法(使用fs模块)
Apr 27 NodeJs
用nodejs实现json和jsonp服务的方法
Aug 25 NodeJs
nodejs搭建本地服务器并访问文件操作示例
May 11 NodeJs
nodejs 递归拷贝、读取目录下所有文件和目录
Jul 18 NodeJs
NodeJs 实现简单WebSocket即时通讯的示例代码
Aug 05 NodeJs
NodeJS 文件夹拷贝以及删除功能
Sep 03 NodeJs
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
Nov 20 #NodeJs
nodejs开发环境配置与使用
Nov 17 #NodeJs
Nodejs全栈框架StrongLoop推荐
Nov 09 #NodeJs
初始Nodejs
Nov 08 #NodeJs
Nodejs极简入门教程(三):进程
Oct 27 #NodeJs
Nodejs极简入门教程(二):定时器
Oct 25 #NodeJs
Nodejs极简入门教程(一):模块机制
Oct 25 #NodeJs
You might like
PHP5中的this,self和parent关键字详解教程
2007/03/19 PHP
ThinkPHP的MVC开发机制实例解析
2014/08/23 PHP
php递归遍历删除文件的方法
2015/04/17 PHP
PHP Web木马扫描器代码分享
2015/09/06 PHP
JavaScript 继承机制的实现(待续)
2010/05/18 Javascript
Jquery倒数计时按钮setTimeout的实例代码
2013/07/04 Javascript
将json当数据库一样操作的javascript lib
2013/10/28 Javascript
详解JS函数重载
2014/12/04 Javascript
实例讲解JQuery中this和$(this)区别
2014/12/08 Javascript
JavaScript设计模式学习之“类式继承”
2015/03/12 Javascript
jquery+php实现滚动的数字特效
2015/11/29 Javascript
JavaScript中三种异步上传文件方式
2016/03/06 Javascript
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
2016/12/15 Javascript
Bootstrap路径导航与分页学习使用
2017/02/08 Javascript
解决IE7中使用jQuery动态操作name问题
2017/08/28 jQuery
Node 升级到最新稳定版的方法分享
2018/05/17 Javascript
node基于async/await对mysql进行封装
2019/06/20 Javascript
vue如何使用rem适配
2021/02/06 Vue.js
Python统计列表中的重复项出现的次数的方法
2014/08/18 Python
Python编写简单的HTML页面合并脚本
2016/07/11 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
解决Linux系统中python matplotlib画图的中文显示问题
2017/06/15 Python
Python实现的字典值比较功能示例
2018/01/08 Python
python-OpenCV 实现将数组转换成灰度图和彩图
2020/01/09 Python
Python正则表达式高级使用方法汇总
2020/06/18 Python
python邮件中附加文字、html、图片、附件实现方法
2021/01/04 Python
详解Sticky Footer 绝对底部的两种套路
2017/11/03 HTML / CSS
阿里旅行:飞猪
2017/01/05 全球购物
毕业生就业自荐信
2013/12/04 职场文书
应届毕业生应聘自荐信
2013/12/07 职场文书
护士岗位求职应聘自荐书范文
2014/02/12 职场文书
理财计划书
2014/08/14 职场文书
辞旧迎新演讲稿
2014/09/15 职场文书
四风之害观后感
2015/06/09 职场文书
开工典礼致辞
2015/07/29 职场文书
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang