当前位置: 首页 > news >正文

npm run dev命令的执行顺序和原理

当我们在开发vue、react等项目的时候经常会用npm run *命令,那么当我们执行这个命令的时候具体都做了些什么呢?接下来我们就来详细探索一下

当执行npm run dev命令时,npm会按照以下步骤进行操作:

1. 查找并执行脚本:

npm首先会在项目的package.json文件中查找scripts字段下的dev属性,并找到与之对应的脚本命令。这意味着,你需要确保在执行npm run dev命令时,你处于正确的目录中,即package.json文件所在的目录。
例如,如果package.json文件中有如下的配置:

{"scripts": {"dev": "node server.js"}
}
   执行npm run dev将会在当前目录下启动一个Node.js服务器,并执行server.js文件。

2. 检查依赖:

在执行脚本之前,npm会检查项目中是否已安装了所有必要的依赖项。如果依赖项不存在,npm会尝试自动安装package.json中列出的依赖项。

3. 执行命令:

一旦依赖项安装完成或确认已存在,npm将执行dev属性中指定的脚本命令。这可以是一个脚本、一个可执行文件或一个自定义的命令。
例如:

{"scripts": {"dev:h5": "cross-env NODE_ENV=development UNI_PLATFORM=h5 vue-cli-service uni-serve" }      
}

当我们运行npm run dev:h5命令的时候他会执行一下逻辑顺序:
1. npm run dev:h5:当你在命令行中执行这个命令时,npm 会查找 package.json 文件中 scripts 部分对应的
“dev:h5” 脚本,并准备执行它。
2. cross-env:首先,cross-env 会被调用,它会在node_modules/.bin的目录下查找该命令的可执行文件并且运行,如果没有找到,他会在全局的依赖包目录下查找。这个工具用于跨平台地设置环境变量。它确保NODE_ENV 和 UNI_PLATFORM 这两个环境变量能够在接下来的命令中正确使用,无论你在什么操作系统上。

  • NODE_ENV=development:cross-env 设置 NODE_ENV 环境变量的值为 development。这告诉应用或库当前处于开发模式。
  • UNI_PLATFORM=h5:同时,cross-env 设置 UNI_PLATFORM 环境变量的值为 h5。这是 Uni-app 的一个特定配置,用于指示接下来的命令是为 H5(网页)平台服务的。
  1. vue-cli-service uni-serve:在设置好环境变量之后,vue-cli-service uni-serve 命令被执行。这是 Vue CLI 的一个服务命令,通常该命令也是存放在node_modules/.bin目录下

4. 开发环境配置:

如果脚本中包含了环境变量的配置,例如通过-mode=development或读取.env.development文件来设置特定的开发环境变量,npm也会处理这些环境相关的配置。

5. 启动开发服务器:

在许多前端项目中,npm run dev会启动一个本地开发服务器,用于开发环境的代码调试。这通常包括监听指定目录下的源代码变化,并根据配置文件进行实时编译打包。

6. 文件监视与刷新:

npm还可能监视文件的变化,以便在文件改变时重新编译代码并刷新浏览器。

7. 执行其他任务:

根据项目的具体配置和开发环境的需要,npm可能会执行其他相关的构建任务,如处理图片、压缩代码等。

8. 启动浏览器实例:

最后,npm可能会启动一个浏览器实例,自动打开应用程序以进行预览。

总的来说,npm run dev命令会根据项目的配置执行一系列的操作,以启动并配置开发环境,使得开发者可以进行实时编码并立即看到结果。这些操作可能包括安装依赖、配置环境变量、启动开发服务器、监视文件变化、执行构建任务以及启动浏览器预览等。具体的操作取决于package.json文件中的配置以及项目的实际需求。

相关文章:

  • 【WEEK4】 【DAY1】整合SSM框架之基本环境搭建—第二部分【中文版】
  • 如何实现跨标签页通讯
  • Windows10无盘母盘制作-以云更新为例
  • Request failed with status code 504,Gateway time out
  • Spring Data访问Elasticsearch----CDI集成
  • 测试平台——前端框架
  • Springboot整合Mybatis的详细案例+图解+分析(一)
  • 什么是通用人工智能(AGI)以及为什么它还没有到来:给AI爱好者的现实检查
  • Gradle
  • 【用法总结】Systrace使用基础
  • 隐私计算实训营学习二:隐私计算开源如何助力数据要素流通
  • 【解读】保障软件供应链安全:SBOM推荐实践指南(含指南获取链接)
  • Github Copilot 工具,无需账号,一键激活
  • nodejs社区垃圾分类管理平台的设计与实现python-flask-django-php
  • 20---复位电路设计
  • AngularJS指令开发(1)——参数详解
  • AWS实战 - 利用IAM对S3做访问控制
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • echarts花样作死的坑
  • flutter的key在widget list的作用以及必要性
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • javascript从右向左截取指定位数字符的3种方法
  • Javascript弹出层-初探
  • Java超时控制的实现
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • LeetCode29.两数相除 JavaScript
  • leetcode386. Lexicographical Numbers
  • Making An Indicator With Pure CSS
  • ReactNative开发常用的三方模块
  • Web标准制定过程
  • 爱情 北京女病人
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 我有几个粽子,和一个故事
  • 树莓派用上kodexplorer也能玩成私有网盘
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • ()、[]、{}、(())、[[]]命令替换
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (差分)胡桃爱原石
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • .describe() python_Python-Win32com-Excel
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Core 通过 Ef Core 操作 Mysql
  • .Net 代码性能 - (1)
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET项目中存在多个web.config文件时的加载顺序
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • ::什么意思
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [acm算法学习] 后缀数组SA
  • [AutoSar]工程中的cpuload陷阱(三)测试
  • [CERC2017]Cumulative Code