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全栈框架StrongLoop推荐
Nov 09 NodeJs
NodeJS学习笔记之Connect中间件模块(一)
Jan 27 NodeJs
NodeJS学习笔记之Connect中间件应用实例
Jan 27 NodeJs
nodejs连接mongodb数据库实现增删改查
Dec 01 NodeJs
windows 下安装nodejs 环境变量设置
Feb 02 NodeJs
详解nodejs express下使用redis管理session
Apr 24 NodeJs
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
May 13 NodeJs
Nodejs 复制文件/文件夹的方法
Aug 24 NodeJs
NodeJS父进程与子进程资源共享原理与实现方法
Mar 16 NodeJs
nodejs实现范围请求的实现代码
Oct 12 NodeJs
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
Aug 20 NodeJs
NodeJs使用webpack打包项目的方法详解
Feb 28 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
php XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
编写php应用程序实现摘要式身份验证的方法详解
2013/06/08 PHP
PHP实现读取一个1G的文件大小
2013/08/24 PHP
php+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
php实现递归与无限分类的方法
2015/02/16 PHP
PHP基于新浪IP库获取IP详细地址的方法
2017/05/04 PHP
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
浅谈javascript属性onresize
2015/04/20 Javascript
jQuery聚合函数实例
2015/05/21 Javascript
jQuery获取页面元素绝对与相对位置的方法
2015/06/10 Javascript
jQuery代码实现发展历程时间轴特效
2015/07/30 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
Vue.js中轻松解决v-for执行出错的三个方案
2017/06/09 Javascript
Django中使用jquery的ajax进行数据交互的实例代码
2017/10/15 jQuery
vue+Java后端进行调试时解决跨域问题的方式
2017/10/19 Javascript
自定义PC微信扫码登录样式写法
2017/12/12 Javascript
react-native 圆弧拖动进度条实现的示例代码
2018/04/12 Javascript
详解.vue文件中style标签的几个标识符
2018/07/17 Javascript
js实现全选反选不选功能代码详解
2019/04/24 Javascript
Vue路由模块化配置的完整步骤
2019/08/14 Javascript
React Native 混合开发多入口加载方式详解
2019/09/23 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
React中Ref 的使用方法详解
2020/04/28 Javascript
Vue基于localStorage存储信息代码实例
2020/11/16 Javascript
深入了解Vue动态组件和异步组件
2021/01/26 Vue.js
[54:25]Ti4 循环赛第三日LGD vs MOUZ
2014/07/12 DOTA
Python 描述符(Descriptor)入门
2016/11/20 Python
想学python 这5本书籍你必看!
2018/12/11 Python
详解python运行三种方式
2019/05/13 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
基于Python模拟浏览器发送http请求
2020/11/06 Python
CSS3实现可爱的小黄人动画
2016/07/11 HTML / CSS
澳大利亚婴儿、幼儿和儿童在线设计师商店:Smooch Baby
2019/02/16 全球购物
消防安全管理制度
2014/02/01 职场文书
美术第二课堂活动总结
2014/07/08 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书