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

了解更多: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

原文地址:https://www.cnblogs.com/lmei/p/8990733.html

时间: 2024-10-11 01:06:06

nodejs备忘总结(一) -- 基础入门的相关文章

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

安装node 本文以安装node_v8.9.0为例(win10环境),下载node-v8.9.0-x64.msi插件 下载后,安装,安装目录默认为C:\Program Files\nodejs 配置环境变量,系统变量->path,添加“C:\Program Files\nodejs\” 运行cmd,输入node -v C:\Windows\system32>node -v v8.9.0 安装express 找到node安装目录C:\Program Files\nodejs,命令行运行 C:\P

备忘:C++基础 -- 数据类型的学习总结

常用的几种数据类型: 类型标识符 说明 字节 值的范围   int 整型 4 –2,147,483,648 到 2,147,483,647 VC++中为long int类 short 短整型 2 –32,768 到 32,767   long 长整型 4 –2,147,483,648 到 2,147,483,647   bool 布尔型 1 false 或 true   char 字符型 1 -128 到 127   float 单精度浮点型 4 3.4E +/- 38(7 位数)   doub

正则表达式入门及备忘

概述 正则表达式,主要是用符号描述了一类特定的文本(模式).而正则表达式引擎则负责在给定的字符串中,查找到这一特定的文本. 本文主要是列出常用的正则表达式符号,加以归类说明.本文仅仅是快速理解了正则表达式相关元字符,作一个备忘,供以后理解更复杂表达式的参考,以后关于正则表达式的相关内容会持续更新本文.示例语言用C# 概述 普通字符 字符集合 速记的字符集合 指定重复次数的字符 匹配位置字符 分支替换字符 匹配特殊字符 组,反向引用,非捕获组 贪婪与非贪婪 回溯与非回溯 正向预搜索.反向预搜索 最

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

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具.被广大中国JS开发者誉为“Web前端开发神器”.“最强大的HTML5编辑器”.“最智能的JavaSscript IDE”等.与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能.百度百科 软件名称: JetBrains WebStorm(java.html5开发工具) v8.0.5 官方英文版 软件大小: 140.7MB 更新时间: 2014-10-01 现将最常用的快捷键挑出来备

UITextView -- 基础备忘

UITextView 这篇文章只涉及到基本的使用,日后会写一些关于结合TextKit的备忘 基本属性 let screenSize = UIScreen.mainScreen().bounds.size let textView = UITextView(frame: CGRectMake(0, 20, screenSize.width, 200)) textView.font = UIFont.systemFontOfSize(20) textView.selectable = false t

go语言初记2(备忘)

 看<Go入门指南>,这里讲得比较基础,针对go 1.0版,以下是一些我自己觉得特别和不容易理解的地方的摘抄!  上次有说到go里不同类型之间操作必须显示转换,int和uint不固定,所以int 不是int32 int 和 uint 在 32 位操作系统上,它们均使用 32 位(4 个字节),在 64 位操作系统上,它们均使用 64 位(8 个字节). package main func main() { var a int var b int32 a = 15 b = a + a // 编译

AngularJS之备忘与诀窍

译自:<angularjs> 备忘与诀窍 目前为止,之前的章节已经覆盖了Angular所有功能结构中的大多数,包括指令,服务,控制器,资源以及其它内容.但是我们知道有时候仅仅阅读是不够的.有时候,我们并不在乎那些功能机制是如果运行的,我们仅仅想知道如何用AngularJS去做实现一个具体功能. 在这一章中,我么视图给出完整的样例代码,并且对这些样例代码仅仅给出少量的信息和解释,这些代码解决是我们在大多数Web应用中碰到的通用问题.这些代码没有具体的先后次序,你尽可以跳到你关心的小节先睹为快或者

RxJava & RxAndroid备忘

"你问我要去向何方,我指着大海的方向" 今天在刷G+的时候看到Dave Smith推荐了一个视频 <Learning RxJava (for Android) by example> 点进去看了一下,原来是位熟悉的"阿三哥",视频封面如下:(没有歧视的意思,不要喷我啊~,为什么感到熟悉?接着往下看) 几乎同时也看到了JetBrains在G+也推荐了篇在Medium上的博文 <RxAndroid And Kotlin (Part 1)> ,然后

Table view 备忘

Table view 备忘 本篇会以备忘为主,主要是一些基础的代理方法和数据源方法具体的优化好点子会后续跟上. Table view的数据源方法 必须实现的数据源方法 // 返回每一行的cell,可以做缓存处理,同样也可能会造成复用问题. func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { // tableview 和 cell 都是在s