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 Express框架中处理404页面一个方式
May 28 NodeJs
Nodejs全栈框架StrongLoop推荐
Nov 09 NodeJs
nodejs教程之环境安装及运行
Nov 21 NodeJs
Nodejs进阶:express+session实现简易登录身份认证
Apr 24 NodeJs
NodeJs安装npm包一直失败的解决方法
Apr 28 NodeJs
nodejs制作爬虫实现批量下载图片
May 19 NodeJs
nodejs 简单实现动态html的方法
May 12 NodeJs
修改Nodejs内置的npm默认配置路径方法
May 13 NodeJs
Nodejs实现多文件夹文件同步
Oct 17 NodeJs
NodeJS 文件夹拷贝以及删除功能
Sep 03 NodeJs
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
Aug 20 NodeJs
Nodejs在局域网配置https访问的实现方法
Oct 17 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树的代码,可以嵌套任意层
2006/10/09 PHP
php array_search() 函数使用
2010/04/13 PHP
php 问卷调查结果统计
2015/10/08 PHP
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
删除重复数据的算法
2006/11/23 Javascript
JavaScript 页面编码与浏览器类型判断代码
2010/06/03 Javascript
js控制表单操作的常用代码小结
2013/08/15 Javascript
使用text方法获取Html元素文本信息示例
2014/09/01 Javascript
jQuery实现的简单无刷新评论功能示例
2017/11/08 jQuery
javascript实现Emrips反质数枚举的示例代码
2017/12/06 Javascript
环形加载进度条封装(Vue插件版和原生js版)
2019/12/04 Javascript
webstorm建立vue-cli脚手架的傻瓜式教程
2020/09/22 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
从零学python系列之从文件读取和保存数据
2014/05/23 Python
关于Python中空格字符串处理的技巧总结
2017/08/10 Python
python机器学习之决策树分类详解
2017/12/20 Python
python使用生成器实现可迭代对象
2018/03/20 Python
基于python的Paxos算法实现
2019/07/03 Python
PYTHON实现SIGN签名的过程解析
2019/10/28 Python
python实现飞机大战小游戏
2019/11/08 Python
python自动化测试之异常及日志操作实例分析
2019/11/09 Python
python序列化与数据持久化实例详解
2019/12/20 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
2020/04/03 Python
Python计算信息熵实例
2020/06/18 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
2021/01/30 Python
小橄榄树:Le Petit Olivier
2018/04/23 全球购物
Doyoueven官网:澳大利亚健身服饰和配饰品牌
2019/03/24 全球购物
小蚁科技官方商店:YI Technology
2019/08/23 全球购物
力学专业毕业生自荐信
2013/11/17 职场文书
大学生职业生涯规划书范文
2014/01/04 职场文书
自动化专业职业生涯规划书范文
2014/01/16 职场文书
新学期主题班会
2015/08/17 职场文书
微信小程序和php的登录实现
2021/04/01 PHP
python基础详解之if循环语句
2021/04/24 Python
python中的装饰器该如何使用
2021/06/18 Python
JS精髓原型链继承及构造函数继承问题纠正
2022/06/16 Javascript