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知识库 -> npm安装包原理 -> 正文阅读

[JavaScript知识库]npm安装包原理

总所周知npm是包管理工具可以安装别的写好的模块,但是npm i 的时候发生了什么?为什么会出现package-lock.json文件呢? package-lock.json 文件的作用又是什么?npm run script发生了什么?好滴好滴带着我们的疑问开始探索吧!!~~~

npm i 的时候发生了什么?

npm install用来安装模块到node_module目录汇中,安装之前,会先检查node_module目录汇中是否已经存在指定的模块,如果存在,就不再进行安装即使远程仓库有了最新版。如果想重新都安装一遍可以用-f or -force。
安装进程:
① 发出npm install指令
② npm 向registry查询模块压缩包地址,并生成package-lock.json文件。
③ 下载压缩包,放在~/.npm目录
④ 解压压缩包到当前项目的node_modules目录

当有package-lock.json时,执行npm install 时,为保证各成员依赖的版本是一致的,确定唯一的node_modules树。node从package.json中拿到模块名称,从package-lock.json拿到版本号 (文件锁定版本号,包括主模块和子依赖)。因此这样就保证了不会自动更新最新版。

npm run script的时候发生了什么?

首先我们要知道一个现象:直接运行script对应的指令是报错的,操作系统中不存在这个指令。那为什么运行这个script就可以运行script对应的指令就会报错呢??很好,带着我们的疑惑继续:安装依赖的时候,通过执行npm i xxx来安装的,例如:npm i @vue/cli-service ,npm在安装这个依赖的时候会在node_modules/.bin目录中创建好vue-cli-service为名的几个可执行文件。.bin目录下的文件表示一个个软连接,打开文件可以看到文件顶部写着#!/bin/sh,表示这是个脚本。因此在执行npm run xxx 时,npm 会在./node_modules/.bin中找到这个xxx文件作为脚本来执行,相当于执行了./node_modules/.bin/xxx。
上述提到的软连接又抛出了一个新的问题:

.bin 目录下的文件表示软连接,那这个bin目录下的那些软连接文件是哪里来的呢?它又是怎么知道这条软连接是执行哪里的呢?下面我们会解释这个问题

从 package-lock.json 中可知,当我们npm i 整个新建的vue项目的时候,npm 将 bin/vue-cli-service.js 作为 bin 声明了。所以在 npm install 时,npm 读到该配置后,就将该文件软链接到 ./node_modules/.bin 目录下,而 npm 还会自动把node_modules/.bin加入$PATH,这样就可以直接作为命令运行依赖程序和开发依赖程序,不用全局安装了。

假如我们在安装包时,使用 npm install -g xxx 来安装,那么会将其中的 bin 文件加入到全局,比如 create-react-app 和 vue-cli ,在全局安装后,就可以直接使用如 vue-cli projectName 这样的命令来创建项目了。

所以总而言之:

就是说,npm i 的时候,npm 就帮我们把这种软连接配置好了,其实这种软连接相当于一种映射,执行npm run xxx 的时候,就会到 node_modules/bin中找对应的映射文件,然后再找到相应的js文件来执行。

软连接相当于一种映射,执行npm run xxx 的时候,就会到 node_modules/bin中找对应的映射文件,然后再找到相应的js文件来执行。

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-06-29 18:55:53  更:2022-06-29 18:59:34 
 
开发: 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 13:11:49-

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