关于 vue/cli 脚手架实现项目编译运行的源码解析

1.vue项目运行命令解析

在日常开发中,vue 项目通过vue-cli-service脚手架包将项目运行起来,常用的命令例如:

npm run serve

npm run build

上述执行命令实际一般对应为项目中 package.json 文件的 scripts属性中编写的脚本命令,在项目目录中的终端运行时即匹配到对应的脚本命令,例如:

匹配对应的脚本命令,例如npm run serve ,即运行 vue-cli-service serve 脚本命令,此时,会去加载项目中 node_modules 文件夹中的.bin 文件找到对应的执行文件,如下:

 2.关于 node_modules 中 vue-cli-service 文件的加载过程

在加载 vue-cli-service 文件的过程,我们知道mode_modules 中.bin 文件对应的是链接文件,即实际会找到 node_modules 文件夹下的vue-cli-service 依赖包中的对应vue-cli-service.js文件加载运行

即找到 node_modules 文件夹下的@vue包下面的cli-service包下的vue-cli-service.js 文件进行运行,如下:

可以看到.bin 文件中的 vue-cli-service 文件与@vue/cli-service/bin/vue-cli-service.js 文件内容一致,实际运行的也是@vue/cli-service/bin/vue-cli-service.js,可以发现文件中主要引入了../lib/Service文件,并创建 service 类,调用 service 类中的 run 方法,接下来就是对应找到service 类中对应的 run 方法的运行内容。

注意:传入 run 方法中的 command在运行 npm run serve时,这时的 command即等于字符串 serve  即脚本命令中的后面的参数

我们找到/lib/Service 文件,如下:

可以看到 run 方法中主要调用了 fn 函数,fn 从方法中的 command中取出,command从 this.commands通过[name]取出,即 this.commands['serve'],但是在该文件中可以看到 commands 并没有什么初始化赋值操作,如下:

此时回到 run 方法中可以看到在执行 fn 函数前,主要执行了这两个方法,我们主要看 init 初始化函数,setPluginsToSkip 方法主要是做对一些内置 plugins 进行忽略

    // --skip-plugins arg may have plugins that should be skipped during init()// 需要忽略的默认 pluginsthis.setPluginsToSkip(args)// load env variables, load user config, apply pluginsthis.init(mode)

找到 init() 方法, 如下

在 init 方法中我们主要看这段代码,其他代码是主要做一些配置处理,实际主要是看 apply 方法的的调用

    this.plugins.forEach(({ id, apply }) => {if (this.pluginsToSkip.has(id)) returnapply(new PluginAPI(id, this), this.projectOptions)})

可以看到是对文件中的 this.plugins 进行循环,结构每个 item 中的 apply 方法进行调用,我们找到 plugins 的初始化,如下:

可以看到,Service 类中初始化是对 plugins 赋值通过调用了 resolvePlugins 方法进行初始化,如下:

在resolvePlugins 方法中我们可以看到遍历了builtInPlugins,进行赋值给 plugins 并返回

此时回到 init 方法中对 this.plugins的遍历即 apply 调用:

我们即可得知,apply 的调用,是对 resolvePlugins方法中的的 require(id)调用,如下:

在 run serve的时候,实际即对应 require('./commands/serve')去加载对应该文件,我们进入到该文件, 如下:

查看./commands/serve文件可以看到,文件主要导出了上述的回调函数,回调函数内部调用了api.registerCommand函数,关于为什么可以取到到 api.registerCommand调用,我们就要回到apply() 函数调用的时候的传参,如下:

可以看到是创建了 PluginAPI这个类,并把 id 传入(./commands/serve等等)及当前上下文 this,我们找到 PluginAPI的类文件,如下:

可以看到PluginAPI类中的定义了registerCommand方法,而该方法的内容中可以看到对 this.service.commands[name] 赋值了{fn,opts}对象,这就解释了前面@vue/cli-service/bin/vue-cli-service.js中的 run 方法为什么可以取出 fn 函数进行调用,即下图:

此时我们最后来看 fn函数,对应的是什么内容,如下:

最后我们去看 serve()函数内容, 如下:

3.找到 webpack加载文件处

可以看到熟悉的Starting development server...,即项目运行时终端中会打印的信息,继续往下查看该函数,最终可以看到运用 webpack 包,并传入config配置解析,并使用 WebpackDevServer 这个 plugin,即开启本地运行的插件, 如下:

函数的最后我们可以看到,启动了 server 的监听函数,即成功将项目编译完成开启本地服务运行,如下:

4.总结

通过解析vue-cli-serve的源码,以上便是 vue-cli脚手架 运用 webpack 进行内部封装,如何实现脚手架内将项目解析打包,加载在内存中,并拉起本地服务,实现本地运行vue项目的流程。

npm run serve -> vue-cli-service.js ->service.run ->service.init ->apply ->require('./commanmds/serve') ->PluginAPI.registerCommand -> serve()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1534197.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

解码3D数字人及AIGC产品,如何赋能医美行业全场景业务增长

9月13日,第六届“医美小小聚”暨医美信息与服务创新发展大会在热烈的氛围中拉开帷幕。此次盛会汇聚了医美行业的顶尖精英与前瞻者,他们围绕“聚焦营销,合规增长,融合共创”的主题,深入剖析了行业的新趋势、新机遇与新挑…

【JUC并发编程系列】深入理解Java并发机制:Synchronized机制深度剖析、HotSpot下的并发奥秘(四、synchronized 原理分析)

文章目录 【JUC并发编程系列】深入理解Java并发机制:Synchronized机制深度剖析、HotSpot下的并发奥秘(四、synchronized 原理分析)1. 虚拟机环境2. 基本数据类型占多少字节3. JVM对象头3.1 Klass Pointer3.2 实例属性3.3 对齐填充3.4 查看Java对象布局3.5 论证压缩效…

LeetCode 热题 100 回顾13

干货分享,感谢您的阅读!原文见:LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 (简单) 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标…

通信工程学习:什么是TDMA时分多址

TDMA时分多址 TDMA(Time Division Multiple Access,时分多址)是一种在无线通信中广泛使用的多址接入技术。它通过将时间划分为不重叠的时间帧,并将每个时间帧进一步划分为多个时隙,每个时隙分配给不同的用户或通信系统…

第J3周:DenseNet算法实战与解析(TensorFlow版)

>- **🍨 本文为[🔗365天深度学习训练营]中的学习记录博客** >- **🍖 原作者:[K同学啊]** 📌 本周任务: ●1.请根据本文 Pytorch 代码,编写出相应的 TensorFlow 代码(建议使用…

Apple M3编译MAVSDK安卓平台SO库

1.克隆MAVSDK源码: git clone https://github.com/mavlink/MAVSDK.git --recursive 2.编写Shell脚本用于生成Android平台makefile: 生成前,先编译并安装OpenSSL: Apple M3编译OpenSSL安卓平台SO库-CSDN博客 注释掉openssl自动编译,位于third_party/CMakeLists.txt下

自动驾驶:LQR、ILQR和DDP原理、公式推导以及代码演示(七、CILQR约束条件下的ILQR求解)

(七)CILQR约束条件下的ILQR求解 CILQR((Constrained Iterative Linear Quadratic Regulator)) 是为了在 iLQR 基础上扩展处理控制输入和状态约束的问题。在这种情况下,系统不仅要优化控制输入以最小化代价函数&#x…

GD32F4开发 -- FreeRTOS移植

之前讲过FreeRTOS,参看:FreeRTOS学习 – 再识 讲解了什么是FreeRTOS、FreeRTOS的特点、源码下载和目录文件介绍。 这里就不做更多讲解了,直接介绍怎么移植。 一、下载 官网: https://www.freertos.org/zh-cn-cmn-s/ 源码下载&a…

【C++二分查找 容斥原理】1201. 丑数 III

本文涉及的基础知识点 C二分查找 容斥原理:组合数学汇总 LeetCode1201. 丑数 III 丑数是可以被 a 或 b 或 c 整除的 正整数 。 给你四个整数:n 、a 、b 、c ,请你设计一个算法来找出第 n 个丑数。 示例 1: 输入:n …

总结拓展九:SAP数据迁移(2)

第三节 数据迁移工具LTMC实操 1、供应商(BP)主数据导入 1.1 首先在SAP S 4系统,通过事务代码“LTMC”跳转进入数据迁移控制台(网页版); 1.2 点击“创建”按钮,创建迁移项目“NJDHMM-01”; 传…

大模型→世界模型下的「认知流形」本质·下

本篇内容节选自今年初我撰写的那篇10万的文章《融合RL与LLM思想,探寻世界模型以迈向AGI》,其观点也是文章中核心中的核心。 想进一步完整阅读的小伙伴可关注评论,节选内容如下↓ 接上篇..“因此当前无论对先验自回归学习下的LLMs也好还是未来…

基于python+django+vue的社区爱心养老管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的社…

用Python实现时间序列模型实战——Day 20: 时间序列预测的综合练习

一、学习内容 在本节中,我们将综合应用前几周学习的时间序列分析与预测方法,完成一个完整的时间序列预测项目,包含从数据预处理、异常检测、模型选择、预测到评估的全流程。项目流程: 1. 数据获取与预处理 数据加载&#xff0c…

三、二叉树-算法总结

文章目录 三、二叉树3.1 二叉树遍历3.1.1 前序遍历3.1.2 中序遍历3.1.3 后序遍历3.1.4 DFS 深度搜索3.1.5 BFS 广度搜索3.1.6 BFS 广度搜索 2 3.2 二叉树分治3.2.1 检验二叉搜索树3.2.2 二叉树的最大深度3.2.3 平衡二叉树 3.3 二叉树分治法3.3.1 二叉树中的最大路径和3.3.2 二叉…

mysql数据库如何开启binlog日志

首先我们要知道什么是binlog日志 binlog是 MySQL数据库的二进制日志文件,记录了数据库更改的所有操作,但不包括SELECT和SHOW这类操作,这些操作对数据进行修改、管理操作、数据库修改等操作都会被记录在日志中。 对于一个sql,它…

Qt-QPushButton按钮类控件(22)

目录 描述 使用 给按钮添加图片 给按钮添加快捷键 添加槽函数 添加快捷键 添加组合键 开启鼠标的连发功能 描述 经过上面的一些介绍,我们也尝试的使用过了这个控件,接下来我们就要详细介绍这些比较重要的控件了 使用 给按钮添加图片 我们创建…

在线IP代理检测:保护您的网络安全

在互联网飞速发展的今天,越来越多的人开始意识到网络安全和隐私保护的重要性。在线IP代理检测工具作为一种有效的网络安全手段,能够帮助用户识别和检测IP代理的使用情况,从而更好地保护个人隐私和数据安全。本文将详细介绍在线IP代理检测的相…

最好用的翻译器:什么是DeepL?如何订阅支付DeepL,订阅DeepL Pro以及申请DeepL API?

DeepL目前最好用的翻译软件,如果是学习翻译的同学或者海外客户翻译,一定不能错过,用它来处理文件,论文等翻译是最好不过了的!!! AI翻译技术的飞速发展正在颠覆我们的沟通方式,打破语…

预测日前电价:回顾最先进的算法、最佳实践和公开基准——阅读笔记

Forecasting day-ahead electricity prices: A review of state-of-the-art algorithms, best practices and an open-access benchmark 预测日前电价:回顾最先进的算法、最佳实践和公开基准 Applied Energy (2021) 摘要:电价预测在过去二十年间已经得到…

【pycharm】安装以及简单使用教程

以windows版本举例: 1、首先去Pycharm官网,或者直接输入网址:http://www.jetbrains.com/pycharm/download/#sectionwindows,下载PyCharm安装包,根据自己电脑的操作系统进行选择,对于windows系统选择下图的…