浅谈node模块与npm包管理工具


Posted in Javascript onJanuary 03, 2018

在Node.js中,以模块为单位划分所有的功能,并且提供了一个完整的模块加载机制,所以我们可以将应用程序划分为各个不同的部分,并且对这些部分进行很好的协同管理。通过将各种可重用代码编写在各种模块中的方法,可以大大减少应用程序的代码量,提高应用程序的开发效率以及应用程序代码的可读性。通过模块加载机制,可以将各种第三方模块引入到我们的应用程序中。

在node.js中,提供npm包管理工具,用于从第三方网站上下载各种Node.js包。

一、模块

1.1 加载模块

在Node.js中,以模块为单位划分所有的功能,一个Node.js应用程序由大量的模块组成,每一个模块都是一个JavaScript文件,在加载node.js中预先定义的核心模块,我们只需要require('模块名'),例如require('http'),在将第三方类库引入到我们的应用程序时,需要指定该文件的完整路径及文件名,例如 require('./script/foo.js')

1.2 访问模块

1.2.1使用exports对象访问

在一个模块文件中定义变量、函数或对象只在该模块内有效,当你需要从外部模块引用这些变量、函数或对象时,需要再改模块内,例如,建一个testModule.js,代码如下:

var testVar = "Can you see me now ? ";
var funName = function(name){
  console.log('My name is' + name);
}
exports.testVar = testVar ;
exports.funName = funName ;

那么我们想在http.js中使用这些变量、函数或对象,可在http.js中书写如下代码:

var test1 = require('./testModule.js');
// 通过test1访问testModule.js模块内的testVar变量 和funName函数
console.log(test1.testVar)
test1.funName('Luckfine')

node 运行下这个http.js node http.js

运行结果如下

浅谈node模块与npm包管理工具

1.2.2使用module.exports对象访问

当你需要从外部模块引用这些变量、函数或对象时,使用exports对象,也可以使用module.exports,但是需要将模块定义一个类时,只能用module.exports。

例如定义一个testModule类,在testModule.js中如下代码:

var _name,_age
var name = '',age = 0;
var foo = function(name,age){
  _name = name ; 
  _age = age ;
}
// 获取私有变量_name的变量只
foo.prototype.GetName = function(name){
  return _name;
};
// 设置私有变量_name的变量值
foo.prototype.SetName = function(name){
  _name = name;
}
// 获取私有变量_age的变量只
foo.prototype.GetAge = function(age){
  return _age;
};
// 设置私有变量_name的变量值
foo.prototype.SetAge = function(age){
  _age = age;
}
foo.prototype.name = name;
foo.prototype.age = age;
module.exports = foo;

那么我们想在http.js中使用这个类的变量、函数或对象,可在http.js中书写如下代码:

var foo = require('./testModule.js');
var myFoo = new foo('Luckfine',18);

console.log('获取修改前的私有变量值')
console.log(myFoo.GetName());
console.log(myFoo.GetAge());

console.log('修改私有变量');
myFoo.SetName('Baby');
myFoo.SetAge(16);

console.log('获取修改后的私有变量值')
console.log(myFoo.GetName());
console.log(myFoo.GetAge());


console.log('获取修改前的公有变量值')
console.log(myFoo.name);
console.log(myFoo.age);

console.log('修改公有变量')
myFoo.name = "Tom";
myFoo.age = 20;

console.log('获取修改后的公有变量值')
console.log(myFoo.name);
console.log(myFoo.age);

然后在iTerm中运行node http.js命令,运行结果如下所示

浅谈node模块与npm包管理工具

总结以上:

也就是说,js文件和js文件之间有两种合作的模式:
1) 某一个js文件中,提供了函数,供别人使用。 只需要暴露函数就行了; exports.msg=msg;
2) 某一个js文件,描述了一个类。 module.exports = People;

二、npm包管理

npm是跟随Node.js一起的包管理工具,能解决Node.js代码部署上的很多问题,当我们使用npm去安装一些第三方库的时候,安装包会放在运行npm命令时所在的目录中的node_modules文件夹中,如果当前目录下没有node_modules,会在当前目录下生成node_modules目录,并把我们需要的第三方库放在node_modules中。

所以在安装的时候,要注意,命令提示符所在的位置。

安装第三方库的命令  npm install 模块名字, 假如我们需要安装express,那么只需要在命令行中输入npm install express

1.我们的依赖包,可能在随时更新,我们永远想保持更新,或者某持某一个版本;
2.项目越来越大的时候,给别人看的时候,没有必要再次共享我们引用的第三方模块。

所以我们可以使用package.json来管理依赖包。

在cmd中,使用npm init可以初始化一个package.json文件,用回答问题的方式生成一个新的package.json文件。

生成package.json的作用就是,如果一不小心我们丢了什么依赖,那么只要我们直接npm install就可以安装package.json中的缺失的依赖;

package.json中版本号前面有一个尖角号,表示固定版本,即固定使用我现在安装的版本;

例如我们现在新建一个文件夹

浅谈node模块与npm包管理工具

1、新建文件夹

我们现在需要安装一个第三方库express,就先进入这个文件夹,打开命令行,在此输入 npm install express'' 等命令行完成之后,我们会看到在文件夹中就新建了一个node_modules文件夹,并且把我们需要的库已经安装在文件夹中

浅谈node模块与npm包管理工具

2、安装后文件夹中内容

然后我们需要一个package.json管理我们的包,就可以在命令行中输入npm init,这时可已根据命令行的提示回答问题建立package.json

浅谈node模块与npm包管理工具

3、建立package.json

那么我们这个项目的一些依赖,版本号,描述,作者等都可以通过package.json进行相应管理。

浅谈node模块与npm包管理工具

4、包管理

我这个包管理内容比较少,那么正常情况下package.jaon都有如下内容

 浅谈node模块与npm包管理工具

浅谈node模块与npm包管理工具

浅谈node模块与npm包管理工具

浅谈node模块与npm包管理工具

三、模块对象的属性

这个作为更深入的了解。

在模块文件内部,可以访问当前模块的如下一些属性。

module.id : 表示该模块文件的绝对路径。

module.filename :属性值为当前模块的文件名

module.loaded :属性值为布尔值,当属性值为false时表示模块尚未加载完毕,反之为加载完毕。

module.parent:属性值为当前模块的父模块对象,即调用当前模块的模块对象

module.children:属性值为一个数组,其中存放了当前模块所有子模块对象,即当前模块中已加载的所有模块对象。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery each()源代码
Feb 14 Javascript
Ajax执行顺序流程及回调问题分析
Dec 10 Javascript
jquery foreach使用示例
Sep 12 Javascript
jQuery插件jQuery-JSONP开发ajax调用使用注意事项
Nov 22 Javascript
基于javascript简单实现对身份证校验
Jan 25 Javascript
js字符串操作总结(必看篇)
Nov 22 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
Feb 27 Javascript
关于JS与jQuery中的文档加载问题
Aug 22 jQuery
vue+axios+element ui 实现全局loading加载示例
Sep 11 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
Apr 19 Javascript
微信小程序云开发(数据库)详解
May 17 Javascript
简单了解vue中的v-if和v-show的区别
Oct 08 Javascript
JavaScript基于面向对象实现的猜拳游戏
Jan 03 #Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
Jan 03 #Javascript
基于js 各种排序方法和sort方法的区别(详解)
Jan 03 #Javascript
vue项目中用cdn优化的方法
Jan 03 #Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
Jan 03 #Javascript
利用原生js实现html5小游戏之打砖块(附源码)
Jan 03 #Javascript
js判断文件类型大小并给出提示的实现方法
Jan 03 #Javascript
You might like
PHP开源开发框架ZendFramework使用中常见问题说明及解决方案
2014/06/12 PHP
Thinkphp实现短信验证注册功能
2016/10/18 PHP
PHP多维数组元素操作类的方法
2016/11/14 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
2016/11/29 PHP
jquery tools 系列 scrollable学习
2009/09/06 Javascript
javascript获取作用在元素上面的样式属性代码
2012/09/20 Javascript
JavaScript 语言基础知识点总结(思维导图)
2013/11/10 Javascript
jQuery学习笔记之jQuery.extend(),jQuery.fn.extend()分析
2014/06/09 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
2015/04/27 Javascript
js实现表单多按钮提交action的处理方法
2015/10/24 Javascript
javascript 中的console.log和弹出窗口alert
2016/08/30 Javascript
JQueryEasyUI框架下的combobox的取值和绑定的方法
2017/01/22 Javascript
JavaScript队列的应用实例详解【经典数据结构】
2017/04/12 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
vue实现全选、反选功能
2020/11/17 Javascript
Vue组件和Route的生命周期实例详解
2018/02/10 Javascript
vue-router 源码之实现一个简单的 vue-router
2018/07/02 Javascript
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
2018/09/07 Javascript
[01:38:19]夜魇凡尔赛茶话会 第五期
2021/03/11 DOTA
关于Python中Inf与Nan的判断问题详解
2017/02/08 Python
Python实现Linux中的du命令
2017/06/12 Python
使用Pyinstaller的最新踩坑实战记录
2017/11/08 Python
ubuntu17.4下为python和python3装上pip的方法
2018/06/12 Python
python list格式数据excel导出方法
2018/10/31 Python
numpy下的flatten()函数用法详解
2019/05/27 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
2019/07/31 Python
Pytorch加载部分预训练模型的参数实例
2019/08/18 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
深入了解Python 方法之类方法 & 静态方法
2020/08/17 Python
浙大网新C/C++面试解惑
2015/05/27 面试题
使用C#编写创建一个线程的代码
2013/01/22 面试题
Prototype是怎么扩展DOM的
2014/10/01 面试题
班委竞选演讲稿
2014/04/28 职场文书
2015年学校保卫部工作总结
2015/05/11 职场文书
对讲机知识
2022/04/07 无线电
SQL Server中搜索特定的对象
2022/05/25 SQL Server