IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Node.js第二天(模块化和包) -> 正文阅读

[JavaScript知识库]Node.js第二天(模块化和包)

作者:http://javascript.ruanyifeng.com/nodejs/packagejson.html

1.模块化基本介绍

?????1.1模块????????

????????模块是对功能相似的函数或属性的封装。例如:

????????? fs 模块中封装了一系列文件操作的函数。例如:fs.readFile()、fs.writeFile()

????????? path 模块中封装了一系列路径处理的函数。例如:path.join(),path.basename()

????????模块的好处:提高了函数的复用性!

? ??1.2什么是模块化?????????

????????一个js文件可以引入其他的js文件,能使用引入的js文件的中的变量、数据,这种特性就称为? ? ? ? ? 模块化。

? ? ? ?nodejs是支持模块化的。

? ? 1.3 es6之前js没有模块化的功能

????????提问:在浏览器中,我们写代码时,

- index.html      # 主页
- index.js        # 主页需要用到的js代码
--- getData()     # 在index.js中有一个方法
- tool.js         # 为整个项目提供公共方法
--- doSomething() # 在tool.js有一个方法

????????对于如上的代码结构,

????????问:如何能让index.js中的getData去使用tool.js中的doSomething()函数?

????????答:通过index.html过渡。在index.html中,先引入tool.js,再引入index.js

????????问:为什么不能直接让index.js来直接使用tool.js的函数,而要通过index.html来统一管理呢?

????????答:原因很简单:es5中不支持模块化

? 1.4 不支持模块化会有什么问题?

? ? ? ? 会出现代码污染 ......? ?代码维护起来会很困难?

2.模块化发展?

? 2.1历程

  • es6之前

    es5不支持模块化,为了让支持模块化,我们一般会借用第三方库来实现:

  • es6之后

    • es6原生语法也支持模块化(并不表示浏览器也直接支持模块化 --- 需要单独设置一下)

    • Nodejs内部也支持模块化(与es6的模块化有些不同之处),具体的语法在后面来介绍。

?2.2体验

演示性的学习,让大家了解几种模块化的写法

  • nodejs的模块化

  • es6的模块化

  • sea.js

  • require.js

参考: LABjs、RequireJS、SeaJS 哪个最好用?为什么? - 知乎

3.模块化规范??

? 3.1常见的模块化规范

  • CommonJS 规范:nodejs中遵守的就是commonjs规范。

  • ES6 模块化规范:(前后端通用的模块化规范;Node.js、Vue、React 中都能使用!)

  • CMD 和 AMD 模块化规范(较少使用): CMD--sea.js, AMD-require.js

  • UMD 叫做通用模块定义规范(Universal Module Definition),它可以通过运行时或者编译时让同一个代码模块在使用 CommonJs、CMD 甚至是 AMD 的项目中运行。它没有自己专有的规范,是集结了 CommonJs、CMD、AMD 的规范于一身。

4.用commonJS规范来自定义模块

? 4.1遵守commonJS规范

? ?在Node.js 中定义模块,要遵守 CommonJS 的模块化规范。CommonJS 规范中主要规定了以下? ? ?3 项内容:

? ?①导入其它模块时,统一使用 require() 函数。

? ?②每个 .js 文件,都是一个独立的模块,模块内的成员都是私有的。

? ?③在每个 JS 模块中,使用 module.exports 向外共享成员。

? 4.2示例?

自定义模块的特点:

①使用 require('自定义模块的路径') 即可导入自定义模块;

②自定义模块内的变量、函数等都是私有的,默认无法被外界访问到;

5.练习?

  1. 完成自定义模块部分的代码

  2. 请将下面的函数按commonJS的规范进行封装,并导出使用。

const relativeTime = (oldTime) => {
  const t = new Date(oldTime)
  // Date.now():现在的时间戳(毫秒)
  // t.getTime():旧时间的时间戳(毫秒)

  const diff = Date.now() - t.getTime() // 相隔多少毫秒
  // Math.floor 向下取整: 1.7年 ---> 1年前
  const year = Math.floor(diff / (1000 * 3600 * 24 * 365))
  if (year) {
    return `${year}年前`
  }
  const month = Math.floor(diff / (1000 * 3600 * 24 * 30))
  if (month) {
    return `${month}月前`
  }
  const day = Math.floor(diff / (1000 * 3600 * 24))
  if (day) {
    return `${day}天前`
  }
  const hour = Math.floor(diff / (1000 * 3600))
  if (hour) {
    return `${hour}小时前`
  }
  const minute = Math.floor(diff / (1000 * 60))
  if (minute) {
    return `${minute}分钟前`
  } else {
    return '刚刚'
  }
}

3.根据路径,导入自定义模块后打印出返回的结果如下?

4.输出结果?

?

6.导出模块的两种方式?

?6.1两种方式

  • exports

  • module.exports

// 定义方法,常量
const myPI = 3.14
const add = (a,b) => a + b;

// 导出,两种方法任意都可以
// 方法一:
exports.myPI = myPI
exports.add = add

// 方法二:
module.exports.myPI = myPI
module.exports.add = add

// 方法二(变形)
module.exports  = {
    myPI,
    add
}

6.2 两个对象的关系

??初始exports和module.exports是指向同一块内存区域,其内容都是一个空对象

? exports是module.exports的别名,即:

exports === module.exports // 输出是 true

?所以下面两种写法的效果是一样的:

 //1 mymodule.js
 exports.f = function(){ }
 exports.pi = 3.1415926
//2 mymodule.js
 module.exports.f = function(){ }
 module.exports.pi = 3.1415926

在定义模块时:

如果直接给exports对象赋值(例如:exports={a:1,b:2}),此时,exports就不会再指向module.exports,而转而指向这个新对象,此时,exports与module.exports不是同一个对象。

7.npm和包和模块

?7.1 npm

  • npm 全称 Node Package Manager(node 包管理器),它的诞生是为了解决 Node 中第三方包共享的问题。

  • npm 不需要单独安装。在安装Node的时候,会连带一起安装npm

  • npm -v检查安装的情况。

  • 官网

当我们谈到npm时,我们在说两个东西:

  • 命令行工具。这个工具在安装node时,已经自动安装过了。

  • npm网站。这是一个第三方模块的"不花钱的超市",我们可以自由地下载,上传模块。

?7.2 npm集中管理包

问:在浏览器中是如何使用第三方的工具库,例如:jQuery, bootStrap,echarts.js....

答:从各自的官网上下载。

问:有没有一个想法:在一个地方下载所有的库(模块.....)

答:通过npm去下载。

npm网站上去下载我们的需要的代码时,它们是以""这种结构放在npm网站上的。先来了解下包和模块的关系。

?

  • nodejs中一个模块就是一个单独的js文件

  • 包是多个模块的集合。一个模块的功能比较单一,所以一个包一般会包含多个模块。

  • npm 管理的单位是包。类似于网站和网页的区别:一个网站一般会包含多个网页。

?8.npm下载使用包

? ?8.1?分成三步

  • 初始化项目。npm init 如果之前已经初始化,则可以省略。

  • 安装包。 npm install 包名。

  • 引入模块,使用。?

************?上述操作确保是联网状态****************?

? ?8.2 第一步:初始化项目

????????这里提到的项目并不是某个具体的功能,只是要创建一个空文件夹即可(注意,不要起中文名字哈)。

????????进入到项目所在的根目录下,启动小黑窗(按下shift键,点击右键,在弹出的菜单中选择 “在此处打开命令行”)

输入如下命令:

npm init --yes
// --与yes之间没有空格, -- 与init之间有空格
// 或者是 npm init -y

init命令用来在根目录下生成一个package.json文件,这个文件中记录了我们当前项目的基本信息,它是一切工作的开始。

?8.3 第二步:安装包

生成了package.json文件之后,我们就可以来安装第三方包了。在npm官网中,有上百万个包,供我们使用(你需要在npm网上注册帐号,登陆上去,才可以看到如下的数据,如果只是下载安装包,则并不需要注册)。

?根据我们遇到的实际问题,我们来引入相应的包来解决它们。例如,我们在开发一个项目,其中涉及一些对日期时间的处理可以安装dayjs包。

? 8.4 第三步:使用包

当我们已经下载好一个包之后,就可以像使用核心模块一样去使用它。

格式是:const 常量名 = require('包名')

这个格式与引入核心模块的格式是一样的。

// 从npm下载 别人写的好代码,在本地引入,并使用
const dayjs = require('dayjs')
console.log(dayjs);
console.log( dayjs().format('YYYY-MM-DD') );

9. npm init 命令

在某个目录下开启小黑窗,输入如下命令:

# init 初始化
npm init 

它会启动一个交互式的程序,让你填入一些关于本项目的信息,最后生成package.json文件

如果你希望直接采用默认信息,可以使用:

npm init --yes
// 或者是 npm init -y

说明:

  • 这个命令只需要运行一次,它的目的仅仅是生成一个package.json文件。

  • 如果项目根目录下已经有了package.json文件,就不需要再去运行这个命令了。

  • 这个package.json文件后期是可以手动修改的。

10. package.json文件

它一般是由npm init命令创建出来的,它的整体内容是一个json字符串,用来对当前项目进行整体描述。其中最外层可以看作是一个js的对象(每一个属性名都加了"",这就是一个典型的json标记)。这个文件中有非常多的内容,我们目前学习如下几个:

  • name: 表示这个项目的名字。如是它是一个第三方包的话,它就决定了我们在require()时应该要写什么内容。

  • version:版本号

  • keywords:关键字

  • author: 作者

  • descrption: 描述

其它可参考

1.package.json文件 -- JavaScript 标准参考教程(alpha)

2.package.json | npm 安装文档

11. node_modules文件夹

? ?13.1 作用

? ? ?在使用npm install 命令时,会从npm网站下载对应的包到这个文件夹中,这个文件夹中保存着? 我们从npm中下载来的第三方包。

? ?13.2 执行逻辑

当键入npm install XXX之后(这里假设这个XXX包是存在的,也没有出现任何的网络错误):

  1. 如果有package.json

    (1) 修改package.json文件。根据开发依赖和生产依赖的不同,决定把这句记录在加在devDependencies或者是dependencies列表中。

    (2) 修改node_modules文件夹

    1. 如果有node_modules文件夹,则直接在下面新建名为XXX的文件夹,并从npm中下来这个包。如果这个包还有其它的依赖,则也会下载下来。

    2. 如果没有node_modules,则先创建这个文件夹,再去下载相应的包

  2. 如果没有package.json。会给一个警告信息。

说明:

  • 建议先用init命令创建package.json之后,再去install

  • 在分享代码时,我们一般不需要把node_modules也给别人(就像你不需要把jquery.js给别人,因为他们可以自己去下载)。对方拿到我们的代码之后,先运行npm install(后面不接任何的包名),自己去安装这些个依赖包。

12.包的分类?

13. 安装全局包和项目包

我们通过npm install 命令来安装包,简单说就是把包从npm的官网(或者是指定的镜像源)下载到我们自己的电脑中。那具体这个包下载到哪里了,还是有一点讲究的。

分成两类:

  • 全局安装: 包被安装到了系统目录(一般在系统盘的node_modules中)。

    • 命令:npm install -g 包名 或者 npm install 包名 -g

    • 辅助提示:

npm root -g           // 查看全局包的安装目录
npm list -g --depth 0 // 查看全局安装过的包

项目安装(或者叫本地安装),包安装在当前项目的根目录下(与package.json同级)的node_modules中。

  • ? 命令:npm install 包名

13.1 全局包与项目包的区别

  • 全局安装的包一般可提供直接执行的命令。我们通过对一些工具类的包采用这种方式安装,如:

    gulp, nodemon, live-server, nrm等。

  • 本地安装的包是与具体的项目有关的, 我们需要在开发过程中使用这些具体的功能。

一个经验法则:

  • 要用到该包的命令执行任务的就需要全局安装

  • 要通过require引入使用的就需要本地安装-项目包。

14. 全局安装nrm包

? ?14.1 目标

????????理解nrm的功能,会使用它来调整npm镜像

? ?14.2 作用

? ? ? ? nrm 这个工具是帮助我们切换npm镜像源的。

之前是:

# 设置镜像为taobao。
npm config set registry https://registry.npm.taobao.org
# 设置镜像为npm官方
npm config set registry https://registry.npmjs.org

使用nrm之后,就可以简化上面的命令。

? ?14.3 步骤

共三步

// 第一步: 全局安装 
npm install nrm -g

// 第二步:列出所有的源信息
// (*)标注的就是当前使用的源
nrm ls

// 第三步:根据需要切换源 
// 例如:指定使用taobao镜像源
nrm use taotao

// 接下来,正常安装你需要的包

**********************************************************************************************************

如果nrm ls不能用,请看这里:

安装npm后,nrm ls 报错internal/validators.js:124 throw new ERR_INVALID_ARG_TYPE(name, ‘string‘, value)_LQCV587的博客-CSDN博客

const NRMRC = path.join(process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'], '.nrmrc');

//const NRMRC = path.join(process.env.HOME, '.nrmrc');(注掉)const NRMRC = path.join(process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'], '.nrmrc');

********************************************************************************************************?

附: npm常用命令

  • 查看
npm -v  			    // 查看npm 版本
where node   			// 查看node的安装目录
where npm   			// 查看npm的安装目录
npm root -g 			// 查看全局包的安装目录
npm list -g --depth 0   // 查看全局安装过的包
  • 升级 npm ?
npm install npm --global  // 简写成 -g
npm install npm -g
  • 初始化 package.json ?
npm init -y // 或者是npm init --yes
  • 安装第三方包 ?
// 安装当前目录下package.json中列出的所有的包
// 如果之前安装了包,又在package.json中手动删除依赖
// 它相当是删除包
npm install

// 全局安装
npm install 包名 -g  // npm install -g 包名 

// 本地安装,没有指定版本,默认安装最新的版本
npm install 包名

// 一次安装多个包,空格隔开
npm install 包名1 包名2 包名3

// 安装指定版本的包
npm install 包名@版本号

// 简写。把install简写成 i
npm i 包名
  • 删除已安装的包 ?
npm uninstall 本地安装的包名
npm uninstall 全局安装的包名 -g
  • 设置npm的register ?

如果你不想用 nrm ,下面这个原生的命令也可以切换镜像源(从哪里下载包)。

npm config set registry https://registry.npm.taobao.org

## 所有npm i 包 都会从taobao的镜像去下载。
## 配置后可通过下面方式来验证是否成功
npm config get registry 

?

?

?

本人初学前端,还是菜鸟一枚......上述是个人学习总结,可能并不全面,后续还会继续补充?

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-12 20:38:26  更:2021-09-12 20:38:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 17:03:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码