nodejs备忘总结(一) -- 基础入门
什么是NodeJS
JS是脚本语言,脚本语言都需要一个解析器才能运行。对于写在HTML页面里的JS,浏览器充当了解析器的角色。而对于需要独立运行的JS,NodeJS就是一个解析器。
每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情。例如运行在浏览器中的JS的用途是操作DOM,浏览器就提供了document之类的内置对象。而运行在NodeJS中的JS的用途是操作磁盘文件或搭建HTTP服务器,NodeJS就相应提供了fs、http等内置对象。
什么是npm
npm是node packaged modules的缩写,其实是一个nodejs的module的管理工具
NPM提供了很多命令,例如install和publish,使用npm help可查看所有命令。
使用npm help 可查看某条命令的详细帮助,例如npm help install。
在package.json所在目录下使用npm install . -g可先在本地安装当前命令行程序,可用于发布前的本地测试。
使用npm update 可以把当前目录下node_modules子目录里边的对应模块更新至最新版本。
使用npm update -g可以把全局安装的对应命令行程序更新至最新版。
使用npm cache clear可以清空NPM本地缓存,用于对付使用相同版本号发布新版本代码的人。
使用npm unpublish @可以撤销发布自己发布过的某个版本代码。
在NodeJS中,一般将代码合理拆分到不同的JS文件中,每一个文件就是一个模块,而文件路径就是模块名。
在编写每个模块时,都有require、exports、module三个预先定义好的变量可供使用。
- require
require函数用于在当前模块中加载和使用别的模块,传入一个模块名,返回一个模块导出对象。模块名可使用相对路径(以./开头),或者是绝对路径(以/或C:之类的盘符开头)。另外,模块名中的.js扩展名可以省略。如下示范:
var foo1 = require('./foo');
var foo2 = require('./foo.js');
var foo3 = require('/home/user/foo');
var foo4 = require('/home/user/foo.js');
测试demo
新建一个count.js,该模块内部定义了一个私有变量i,并在exports对象导出了一个公有方法count
var i = 0;
function count() {
return ++i;
}
exports.count = count;
新建testCount.js
var counter1 = require('./count');
var counter2 = require('./count');
console.log(counter1.count());
console.log(counter2.count());
console.log(counter2.count());
运行testCount.js,控制台输出
1
2
3
[Finished in 0.6s]
可见,count.js并没有因为被require了两次而初始化两次。
- exports
exports对象是当前模块的导出对象,用于导出模块公有方法和属性。别的模块通过require函数使用当前模块时得到的就是当前模块的exports对象。以下例子中导出了一个公有方法。
exports.hello = function () {
console.log('Hello World!');
};
也可写成如下格式:
function hello() {
console.log('Hello World!');
};
exports.hello = hello;
- module
什么是module?所谓module和java中的包的概念很类似,一些解决方案的集合。
通过module对象可以访问到当前模块的一些相关信息,但最多的用途是替换当前模块的导出对象。例如模块导出对象默认是一个普通对象,如果想改成一个函数的话,可以使用以下方式。
module.exports = function () {
console.log('Hello World!');
};
以上代码中,模块默认导出对象被替换为一个函数。
Nodejs 创建加载模块
在node.js中创建一个js文件就是创建一个模块。客户端Javascript使用script标签引入js文件就可以访问其内容。这样会带来一些弊端,比如作用域相同产生冲突的问题。
nodejs使用exports和require对象对外提供接口和引用模块。
一个简单的测试demo
(1)新建一个user.js
var userName = '';
function getUserName(){
return userName;
}
function setUserName(name){
userName = name;
}
//将需要被外界访问的定义到exports对象中
exports.getUserName = getUserName;
exports.setUserName = setUserName;
(2)再新建一个test.js
//用require引用test.js
var user = require('./user.js'); user.setUserName('TestMan');
console.log(user.getUserName());
(3)运行test.js,控制台输出
TestMan
[Finished in 0.6s]
上面是将test.js里的希望对外提供访问的函数定义到exports对象。
如果是希望模块对外提供一个对象,而不是单独的函数,可以做如下调整
(1)修改user.js
var User = function(){
var userName = '';
this.setUserName = function(name){
userName = name;
}
this.getUserName = function(){
return userName
}
};
exports.User = User;
这样就对外提供了一个User类。
(2)将test.js也进行修改,修改成
var User = require('./user.js').User;
var user = new User();
user.setUserName('TestMan');
console.log(user.getUserName());
(3)运行test.js,控制台输出
TestMan
[Finished in 0.6s]
如果想将 User = require('./user.js').User;
优化成 User = require('./user.js');
这种格式的写法的话,可以对test.js进行修改
将原来的 exports.User = User;
修改成 module.exports = User;
修改user.js,如下:
var User = function(){
var userName = '';
this.setUserName = function(name){
userName = name;
}
this.getUserName = function(){
return userName
}
};
module.exports = User;
修改test.js,如下
var User = require('./user.js');
var user = new User();
user.setUserName('TestMan');
console.log(user.getUserName());
运行test.js,控制台输出
TestMan
[Finished in 0.7s]
注:上面代码中的require('./user.js'),可以简化成require('./user');
module.exports与exports
module.exports才是模块公开的接口,每个模块都会自动创建一个module对象,对象有一个modules的属性,初始值是个空对象{},module的公开接口就是这个属性module.exports。
模块中会有一个exports对象,和module.exports指向同一个变量,所以修改exports对象的时候也会修改module.exports对象,module.exports对象不为空的时候exports对象就自动忽略是因为module.exports通过赋值方式已经和exports对象指向的变量不同了,exports对象怎么改和module.exports对象没关系了。
学习参考:
http://www.jqhtml.com/7258.html
http://www.cnblogs.com/dolphinX/p/3485260.html
nodejs备忘总结(一) -- 基础入门的更多相关文章
- nodejs备忘总结(一) -- node和express安装与配置,新建简单项目(附安装配置过程中遇到问题的解决方法)
安装node 本文以安装node_v8.9.0为例(win10环境),下载node-v8.9.0-x64.msi插件 下载后,安装,安装目录默认为C:\Program Files\nodejs 配置环 ...
- nodejs 备忘
引入模块(在于你用什么模块,需要的模块可以用终端进行安装, npm,一般express,swig,body-parser,cookies,markdown) 设置模块 设置渲染 var express ...
- 【备忘】WPF基础
XAML 为了避免生成用户界面(GUI)的代码和基于用户操作执行的代码混合在一起. 名称空间 值得注意的名称空间: xmlns="http://schemas.microsoft.com/w ...
- Webstorm常用快捷键备忘(Webstorm入门指南)
WebStorm 是jetbrains公司旗下一款JavaScript 开发工具.被广大中国JS开发者誉为“Web前端开发神器”.“最强大的HTML5编辑器”.“最智能的JavaSscript IDE ...
- Linux基础之常用基本命令备忘
Linux基础之常用基本命令备忘 PWD 查询当前所在Linux上的位置 / 根目录 CD(change directory)切换目录 语法 CD /(注意添加空格) LS ...
- UITextView -- 基础备忘
UITextView 这篇文章只涉及到基本的使用,日后会写一些关于结合TextKit的备忘 基本属性 let screenSize = UIScreen.mainScreen().bounds.siz ...
- AngularJS之备忘与诀窍
译自:<angularjs> 备忘与诀窍 目前为止,之前的章节已经覆盖了Angular所有功能结构中的大多数,包括指令,服务,控制器,资源以及其它内容.但是我们知道有时候仅仅阅读是不够的. ...
- 工作效率-十五分钟让你快速学习Markdown语法到精通排版实践备忘
关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 文章目录: 0x00 前言简述 ...
- 基于Nodejs生态圈的TypeScript+React开发入门教程
基于Nodejs生态圈的TypeScript+React开发入门教程 概述 本教程旨在为基于Nodejs npm生态圈的前端程序开发提供入门讲解. Nodejs是什么 Nodejs是一个高性能Ja ...
随机推荐
- 卸载并安装指定版本Angular CLI
1.卸载之前的版本 npm uninstall -g @angular/cli 2.清除缓存,确保卸载干净 npm cache clean 3.检查是否卸载干净 输入命令 ng -v 若显示comma ...
- bzoj千题计划223:bzoj2816: [ZJOI2012]网络
http://www.lydsy.com/JudgeOnline/problem.php?id=2816 每种颜色搞一个LCT 判断u v之间有边直接相连: 如果u和v之间有边相连,那么他们的深度相差 ...
- Java SSM框架之MyBatis3(七)MyBatis之参数取值
在mybatis中,参数取值方式有两种:#{ } 和 ${ } 一.#{ } select * from student where name=#{name} 编译后执行的sql语句: select ...
- WebSlides - 轻松制作漂亮的 HTML 幻灯片(演讲稿)
WebSlides 是一个开源的 HTML 幻灯片项目,能够帮助熟悉前端语言的开发者快速制作出效果精美的幻灯片.页面中的每个 <section> 都是一个独立的幻灯片,只需要很少的 CSS ...
- [转载]Markdown——入门指南
http://www.jianshu.com/p/1e402922ee32/ 转载请注明原作者,如果你觉得这篇文章对你有帮助或启发,也可以来请我喝咖啡. 导语: Markdown 是一种轻量级的「标记 ...
- 仿QQ聊天图文混排流程图【适用于XMPP】
图文混排流程图.graffle4.8 KB 下面附上图片素材: 表情.zip692.5 KB 下面是字符串与图片的详细对应关系: "[呲牙]& ...
- Django安装配置
django2.0基础 一.安装与项目的创建 1.安装 pip install django 2.查看版本 python -m django --version 3.创建项目 django-admin ...
- 一份最中肯的Java学习路线+资源分享(拒绝傻逼式分享)
这是一篇针对Java初学者,或者说在Java学习路线上出了一些问题(不知道该学什么.不知道整体的学习路线是什么样的) 第一步:Java基础(一个月左右) 推荐视频: 下面的是黑马内部视频,我比较推荐的 ...
- 几个比较实用的CSS
1.filter:chroma(color:#FFFFFF); 让指定的背景色透明,例: <table cellspacing = "0" cellpadding = ...
- 使用 Application Loader提交IPA文件到苹果市场
打包.导出ipa包后剩下的就是要将ipa包推到appstore.Application Loader是苹果提供的ipa包提交工具. 1.启动Application Loader 打开xcode,在xc ...