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 相关文章推荐
golang、python、php、c++、c、java、Nodejs性能对比
Mar 12 NodeJs
Nodejs+express+html5 实现拖拽上传
Aug 08 NodeJs
NodeJS整合银联网关支付(DEMO)
Nov 09 NodeJs
详解nodejs 文本操作模块-fs模块(五)
Dec 23 NodeJs
NodeJS实现客户端js加密
Jan 09 NodeJs
nodejs个人博客开发第四步 数据模型
Apr 12 NodeJs
详解nodeJS之路径PATH模块
May 31 NodeJs
详解nodejs的express如何自动生成项目框架
Jul 12 NodeJs
nodejs中安装ghost出错的原因及解决方法
Oct 23 NodeJs
NVM安装nodejs的方法实用步骤
Jan 16 NodeJs
NodeJs之word文件生成与解析的实现代码
Apr 01 NodeJs
NodeJs实现简易WEB上传下载服务器
Aug 10 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
收音机鉴频器对声音的影响和频偏分析
2021/03/02 无线电
PHP中去除换行解决办法小结(PHP_EOL)
2011/11/27 PHP
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
js 控制图片大小核心讲解
2013/10/09 Javascript
JS使用getComputedStyle()方法获取CSS属性值
2014/04/23 Javascript
Google官方支持的NodeJS访问API,提供后台登录授权
2014/07/29 NodeJs
60个很实用的jQuery代码开发技巧收集
2014/12/15 Javascript
javascript去掉代码里面的注释
2015/07/24 Javascript
Bootstrap自定义文件上传下载样式
2016/05/26 Javascript
AngularJS 遇到的小坑与技巧小结
2016/06/07 Javascript
vue与bootstrap实现时间选择器的示例代码
2017/08/26 Javascript
Node.js学习之地址解析模块URL的使用详解
2017/09/28 Javascript
微信小程序项目实践之主页tab选项实现
2018/07/18 Javascript
webpack实现一个行内样式px转vw的loader示例
2018/09/13 Javascript
浅探express路由和中间件的实现
2019/09/30 Javascript
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
Python操作json数据的一个简单例子
2014/04/17 Python
Python使用百度API上传文件到百度网盘代码分享
2014/11/08 Python
python3爬取各类天气信息
2018/02/24 Python
python执行精确的小数计算方法
2019/01/21 Python
django的auth认证,authenticate和装饰器功能详解
2019/07/25 Python
Jupyter notebook如何修改平台字体
2020/05/13 Python
python类共享变量操作
2020/09/03 Python
css3制作彩色边线3d立体按钮的示例(css3按钮)
2014/05/06 HTML / CSS
移动端Web页面的CSS3 flex布局快速上手指南
2016/05/31 HTML / CSS
HTML5是什么 HTML5是什么意思 HTML5简介
2012/10/26 HTML / CSS
HTML5触摸事件(touchstart、touchmove和touchend)的实现
2020/05/08 HTML / CSS
美国最大的电子宠物训练产品制造商:PetSafe
2018/10/12 全球购物
全球在线商店:BerryLook
2019/04/14 全球购物
公司面试感谢信
2014/02/01 职场文书
九年级政治教学反思
2014/02/06 职场文书
学校安全生产承诺书
2014/05/23 职场文书
就业推荐表院系意见
2015/06/05 职场文书
郭明义电影观后感
2015/06/08 职场文书
Django Paginator分页器的使用示例
2021/06/23 Python
Java日常练习题,每天进步一点点(38)
2021/07/26 Java/Android