什么是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 @可以撤销发布自己发布过的某个版本代码。

了解更多:https://docs.npmjs.com/

在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备忘总结(一) -- 基础入门的更多相关文章

  1. nodejs备忘总结(一) -- node和express安装与配置,新建简单项目(附安装配置过程中遇到问题的解决方法)

    安装node 本文以安装node_v8.9.0为例(win10环境),下载node-v8.9.0-x64.msi插件 下载后,安装,安装目录默认为C:\Program Files\nodejs 配置环 ...

  2. nodejs 备忘

    引入模块(在于你用什么模块,需要的模块可以用终端进行安装, npm,一般express,swig,body-parser,cookies,markdown) 设置模块 设置渲染 var express ...

  3. 【备忘】WPF基础

    XAML 为了避免生成用户界面(GUI)的代码和基于用户操作执行的代码混合在一起. 名称空间 值得注意的名称空间: xmlns="http://schemas.microsoft.com/w ...

  4. Webstorm常用快捷键备忘(Webstorm入门指南)

    WebStorm 是jetbrains公司旗下一款JavaScript 开发工具.被广大中国JS开发者誉为“Web前端开发神器”.“最强大的HTML5编辑器”.“最智能的JavaSscript IDE ...

  5. Linux基础之常用基本命令备忘

    Linux基础之常用基本命令备忘 PWD   查询当前所在Linux上的位置 /         根目录 CD(change directory)切换目录  语法 CD /(注意添加空格)   LS ...

  6. UITextView -- 基础备忘

    UITextView 这篇文章只涉及到基本的使用,日后会写一些关于结合TextKit的备忘 基本属性 let screenSize = UIScreen.mainScreen().bounds.siz ...

  7. AngularJS之备忘与诀窍

    译自:<angularjs> 备忘与诀窍 目前为止,之前的章节已经覆盖了Angular所有功能结构中的大多数,包括指令,服务,控制器,资源以及其它内容.但是我们知道有时候仅仅阅读是不够的. ...

  8. 工作效率-十五分钟让你快速学习Markdown语法到精通排版实践备忘

    关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 文章目录: 0x00 前言简述 ...

  9. 基于Nodejs生态圈的TypeScript+React开发入门教程

    基于Nodejs生态圈的TypeScript+React开发入门教程   概述 本教程旨在为基于Nodejs npm生态圈的前端程序开发提供入门讲解. Nodejs是什么 Nodejs是一个高性能Ja ...

随机推荐

  1. bzoj千题计划237:bzoj1492: [NOI2007]货币兑换Cash

    http://www.lydsy.com/JudgeOnline/problem.php?id=1492 dp[i] 表示 第i天卖完的最大收益 朴素的dp: 枚举从哪一天买来的在第i天卖掉,或者是不 ...

  2. Codeforces 314 E. Sereja and Squares

    http://codeforces.com/contest/314/problem/E 题意: 原本有一个合法的括号序列 擦去了所有的右括号和部分左括号 问有多少种填括号的方式使他仍然是合法的括号序列 ...

  3. html5 canvas旋转+缩放

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. Redis常见业务场景应用

    一定时间范围内不可重复发短信问题 Redis实现消息队列 Redis实现Session共享 ...

  5. Qt 数字和字符处理总结

    1. 四舍五入保留小数几位 QString str="12.3456789"; double d1=str.toDouble(); qDebug()<<"d1 ...

  6. 一个无锁消息队列引发的血案(四)——月:RingQueue(上) 自旋锁

    目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...

  7. pom配置之:<distributionManagement>snapshot快照库和release发布库

    本文转载自:  铁木箱子的mzone的博客: http://www.mzone.cc/article/277.html http://www.mzone.cc/article/279.html 在使用 ...

  8. React 中 context 的使用

    官方文档说明(英) 看了别人写的中文博客,再看了官方英文文档,发现还是官方文档讲的浅显易懂一些,看了之后,半翻译半理解地写了这篇博客,更易于新手理解. 介绍 context 是在 react @ 0. ...

  9. kgtemp文件转mp3工具

    kgtemp文件是酷我音乐软件的缓存文件,本文从技术层面探讨如何解密该文件为mp3文件,并通过读取ID3信息来重命名. kgtemp解密 kgtemp文件前1024个字节是固定的包头信息,解密方案详细 ...

  10. 001 jquery对象与dom对象的转换

    1.jQuery对象介绍 2.jQuery对象转换为Dom对象 3.Dom转换为Jquery对象 4.将jquery转换为Dom程序 <!DOCTYPE html> <html> ...