欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Node.js模块化开发、系统模块及第三方模块

程序员文章站 2022-06-30 22:54:41
...

Node.js模块化开发

推荐阅读:
前端模块化开发的价值
浅谈模块化的JavaScript

一、JavaScript开发弊端

JavaScript在使用时存在两大问题,文件依赖和命名冲突。
Node.js模块化开发、系统模块及第三方模块

1、污染全局变量

//a.js 文件:
var test1='aaaaaa';
//b.js 文件
var test1='bbbbbb';
 <script>
    console.log('test1='+test1);//bbbbbb;
 
</script>
console test1 输出'bbbbbb';悲剧啊

2、命名冲突

//a.js 文件:
function fun(){
    console.log('this is b');
}
 //b.js 文件
 
function fun(){
    console.log('this is b');
}
//main.js 文件
<script src="a.js"></script>
<script src="b.js"></script>
<script>
    fun();//this is b;
</script>

小张在a.js定义了fun(),小李在b.js又定义了fun(),a,b被小王引入到main.js,执行fun(),输出this is b;

3、依赖关系

b.js依赖a.js,标签的书写顺序必须是:

<script type="text/javascript" src="a.js"></script>
<script type="text/javascript" src="b.js"></script>

这样在多人开发的时候很难协调啊,令人头疼的问题。

解决冲突的方法

  1. java式的命名空间
  2. 量前加 “_”
  3. 对象写法
var module1={
    test1:'aaaaaa',
    fun:function(){
        console.log(this.test1);
    }
}

变量和函数封装在对象里面,使用时,调用对象的属性即可:

module1.fun();//aaaaaa

但是这样的写法会暴露所有模块成员,内部状态可以被外部改写,

module1.test1='cccccc';

4、匿名闭包函数

var  module1=(function(){
    var test1='aaaaaa';
    var fun=function(){
        console.log('this is a');
    }
    return{
        fun:fun
    }
}());

匿名函数有自己的作用域,这样外部代码无法读取 module1 function 里面的变量了,从而也不会修改变量或者是覆盖同名变量了,但是还是有缺陷的,module1这个的变量还是暴露到全局了,而去随着模块的增多,全局变量会越来越多。

5、全局引入

像jquery库使用的全局引入。和匿名闭包函数相似,只是传入全局变量的方法不同

(function(window){
    var test1='aaaaaa';
    window.testFun=function(){//通过给window添加属性而暴漏到全局
        console.log(test1);
    }
}(window));

通过匿名函数包装代码,所依赖的外部变量传给这个函数,在函数内部可以使用这些依赖,然后在函数的最后把模块自身暴漏给window。

3,4,5解决方法都是通过定一个全局变量来把所有的代码包含在一个函数内,由此来创建私有的命名空间和闭包作用域。

二、软件中的模块化开发

一个功能就是一个模块,多个模块可以组成完整应用,抽离一个模块不会影响其他功能的运行。

Node.js模块化开发、系统模块及第三方模块

三、Node.js中的模块化开发规范

Node.js规定一个JavaScript文件就是一个模块,模块内部定义的变量和函数默认情况下在外部无法得到

模块内部可以使用exports对象进行成员导出, 使用require方法导入其他模块。
Node.js模块化开发、系统模块及第三方模块

1、模块成员导出

 // a.js
  // 在模块内部定义变量
 let version = 1.0;
 // 在模块内部定义方法
 const sayHi = name => `您好, ${name}`;
 // 向模块外部导出数据 
 exports.version = version;
 exports.sayHi = sayHi;

2、模块成员的导入

  // b.js
  // 在b.js模块中导入模块a
 let a = require('./b.js');
  // 输出b模块中的version变量
 console.log(a.version);
  // 调用b模块中的sayHi方法 并输出其返回值
 console.log(a.sayHi('司夏')); 
//导入模块时后缀可以省略

3、模块成员导出的另一种方式

module.exports.version = version;
module.exports.sayHi = sayHi;

exports是module.exports的别名(地址引用关系),导出对象最终以module.exports为准

4、模块导出两种方式的联系与区别
Node.js模块化开发、系统模块及第三方模块

四、系统模块

1、什么是系统模块
Node运行环境提供的API. 因为这些API都是以模块化的方式进行开发的, 所以我们又称Node运行环境提供的API为系统模块

例:文件模块
Node.js模块化开发、系统模块及第三方模块

2、系统模板fs文件操作
f:file 文件 ,s:system 系统,文件操作系统。

const fs = require('fs');

读取文件内容

fs.reaFile('文件路径/文件名称'[,'文件编码'], callback);

注:callback 为回调函数

示例:

// 1.通过模块的名字fs对模块进行引用
const fs = require('fs');

// 2.通过模块内部的readFile读取文件内容
fs.readFile('./01.helloworld.js', 'utf8', (err, doc) => {
	// 如果文件读取出错err 是一个对象 包含错误信息
	// 如果文件读取正确 err是 null
	// doc 是文件读取的结果
	console.log(err);
	console.log(doc);
});

Node.js模块化开发、系统模块及第三方模块

写入文件内容

fs.writeFile('文件路径/文件名称', '数据', callback);
 const content = '<h3>正在使用fs.writeFile写入文件内容</h3>';
 fs.writeFile('../index.html', content, err => {
   if (err != null) { 
       console.log(err);
       return;
   }
   console.log('文件写入成功');
 }); 

Node.js模块化开发、系统模块及第三方模块

3、系统模块path 路径操作

为什么要进行路径拼接?

1、不同操作系统的路径分隔符不统一

  • Windows 上是 \ 或 /
  • Linux 上是 /

2、因为相对路径有时候相对的是命令行工具的当前工作目录,所以可能会找不到文件报错,使用绝对路径可以避免此类情况发生。

路径拼接语法

path.join('路径', '路径', ...)
  // 导入path模块
 const path = require('path');
  // 路径拼接
 let finialPath = path.join('itcast', 'a', 'b', 'c.css');
  // 输出结果 itcast\a\b\c.css
 console.log(finialPath);
 
// public/uploads/avatar
const path = require('path');

const finalPath = path.join('public', 'uploads','avatar');

console.log(finalPath);

五、相对路径VS绝对路径

大多数情况下使用绝对路径,因为相对路径有时候相对的是命令行工具的当前工作目录,在读取文件或者设置文件路径时都会选择绝对路径

使用__dirname获取当前文件所在的绝对路径

const fs = require('fs');
const path = require('path');

console.log(__dirname);
console.log(path.join(__dirname, '01.helloworld.js'))

fs.readFile(path.join(__dirname, '01.helloworld.js'), 'utf8', (err, doc) => {
	console.log(err)
	console.log(doc)
});

Node.js模块化开发、系统模块及第三方模块

六、第三方模块

1. 什么是第三方模块

别人写好的、具有特定功能的、我们能直接使用的模块即第三方模块,由于第三方模块通常都是由多个文件组成并且被放置在一个文件夹中,所以又名包。

第三方模块有两种存在形式:

  • 以js文件的形式存在,提供实现项目具体功能的API接口。
  • 以命令行工具形式存在,辅助项目开发

2. 获取第三方模块

npmjs.com:第三方模块的存储和分发仓库
Node.js模块化开发、系统模块及第三方模块

npm (node package manager) : node的第三方模块管理工具

  1. 下载:npm install 模块名称
  2. 卸载:npm unintall package 模块名称

全局安装与本地安装

  • 命令行工具:全局安装
  • 库文件:本地安装

3. 第三方模块 nodemon

nodemon是一个命令行工具,用以辅助项目开发。
在Node.js中,每次修改文件都要在命令行工具中重新执行该文件,非常繁琐。

使用步骤

  • 使用npm install nodemon –g 下载它
  • 在命令行工具中用nodemon命令替代node命令执行文件

Node.js模块化开发、系统模块及第三方模块

4. 第三方模块 nrm

nrm ( npm registry manager ):npm下载地址切换工具

npm默认的下载地址在国外,国内下载速度慢

使用步骤:

  • 使用npm install nrm –g 下载它
  • 查询可用下载地址列表 nrm ls
  • 切换npm下载地址 nrm use 下载地址名称(一般选择taobao)
    Node.js模块化开发、系统模块及第三方模块
相关标签: Node.js