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学习小结(一)
Jul 06 NodeJs
nodejs开发环境配置与使用
Nov 17 NodeJs
Nodejs实现的一个静态服务器实例
Dec 06 NodeJs
nodejs实现获取当前url地址及url各种参数值
Jun 25 NodeJs
nodejs加密Crypto的实例代码
Jul 07 NodeJs
nodejs根据ip数组在百度地图中进行定位
Mar 06 NodeJs
nodejs操作mysql实现增删改查的实例
May 28 NodeJs
Nodejs实现多房间简易聊天室功能
Jun 20 NodeJs
nodejs+mongodb+vue前后台配置ueditor的示例代码
Jan 02 NodeJs
nodejs微信扫码支付功能实现
Feb 17 NodeJs
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
Mar 02 NodeJs
通过实例了解Nodejs模块系统及require机制
Jul 16 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
一个简单计数器的源代码
2006/10/09 PHP
应用开发中涉及到的css和php笔记分享
2011/08/02 PHP
PHP内核学习教程之php opcode内核实现
2016/01/27 PHP
jquery不支持toggle()高(新)版本的问题解决
2016/09/24 PHP
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
jquery mobile changepage的三种传参方法介绍
2013/09/13 Javascript
jquery检测input checked 控件是否被选中的方法
2014/03/26 Javascript
扩展Bootstrap Tooltip插件使其可交互的方法
2016/11/07 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
2017/01/13 Javascript
js仿小米手机上下滑动效果
2017/02/05 Javascript
jquery实现超简单的瀑布流布局【推荐】
2017/03/08 Javascript
AngularJs+Bootstrap实现漂亮的计算器
2017/08/10 Javascript
Vue keep-alive实践总结(推荐)
2017/08/31 Javascript
Angularjs使用过滤器完成排序功能
2017/09/20 Javascript
[32:56]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.11
2020/12/16 DOTA
在Python的web框架中编写创建日志的程序的教程
2015/04/30 Python
进一步探究Python的装饰器的运用
2015/05/05 Python
让python 3支持mysqldb的解决方法
2017/02/14 Python
Python实现读取机器硬件信息的方法示例
2018/06/09 Python
Python用Try语句捕获异常的实例方法
2019/06/26 Python
PyQt5实现暗黑风格的计时器
2019/07/29 Python
python多线程与多进程及其区别详解
2019/08/08 Python
Python 字典中的所有方法及用法
2020/06/10 Python
html5 offlline 缓存使用示例
2013/06/24 HTML / CSS
法律专业应届本科毕业生求职信
2013/10/25 职场文书
学生打架检讨书1000字
2014/01/16 职场文书
个人委托书格式
2014/04/04 职场文书
企业爱岗敬业演讲稿
2014/09/04 职场文书
领导班子作风建设年个人整改措施
2014/09/29 职场文书
2015年新教师工作总结
2015/04/28 职场文书
2015年司机年终工作总结
2015/05/14 职场文书
新郎新娘致辞
2015/07/31 职场文书
Python实战之实现康威生命游戏
2021/04/26 Python
HTML CSS 一个标签实现带动画的抖音LOGO
2022/04/26 HTML / CSS
Hive日期格式转换方法总结
2022/06/25 数据库