vue cli源码学习之cli-service

vue cli源码学习之cli-service

目录结构分析

cli-service/ :根目录,代表项目的主要服务模块,用于提供命令行服务插件功能

tests/ :测试文件夹,通常用于存放自动化测试代码。文件夹命名约定为 tests,可能包含单元测试或集成测试,用于验证项目功能的正确性。

bin/ :存放可执行文件或脚本,通常包含启动 CLI 服务的入口文件。例如,可以包含一个启动脚本(如 cli-service),用于用户直接在命令行中调用。

generator/ :用于生成代码的模块,通常包含脚手架代码或代码生成器的逻辑。generator 目录下可能会包含模板和代码生成逻辑,用于生成项目中的文件或初始化项目配置。

lib/:库文件夹,包含项目的核心逻辑代码,主要是供外部调用的核心函数和类等。通常在项目中引用这些功能模块实现特定功能。

migrator/:用于 管理迁移脚本 的目录。该文件夹通常包含数据迁移或版本迁移的逻辑,如数据库结构的迁移等。适用于项目的升级或数据结构的演变。

types/类型声明文件夹。通常用于 TypeScript 项目,定义接口和类型,以确保类型安全和代码的可维护性。类型声明可以为其他模块提供类型支持。

.npmignore:文件用于指定哪些文件和文件夹在发布到 npm 时应被忽略。通过 .npmignore 文件可以控制不需要的文件或目录(如测试文件夹、配置文件等)不会被包含在 npm 包中。

package.json:项目的配置文件,定义了项目的基本信息(如名称、版本、依赖项、脚本等),也是 npm 项目必须包含的文件。通过 package.json 可以管理项目的依赖、命令和元数据。

README.md:项目的自述文件,通常用于向用户介绍项目的功能、安装方法、使用指南等。README.md 文件在 GitHub 和 npm 上也会展示出来,帮助用户了解和使用项目。

webpack.config.js:Webpack 的配置文件,用于配置项目的打包过程。Webpack 是一个前端打包工具,配置文件定义了如何处理、打包项目中的资源(如 JavaScript、CSS、图像等)。

bin/ 目录下的启动脚本

vue-cli-service 的命令行脚本,主要功能是启动 Vue CLI 服务。以下是代码的主要作用和流程:
1.检查 Node.js 版本:
使用 semver 模块检查当前运行的 Node.js 版本是否满足 package.json 中定义的版本要求。
如果不满足要求,输出错误信息并终止进程。

2. 创建服务实例
导入 Service 类并创建一个服务实例。服务的上下文是当前工作目录或环境变量VUE_CLI_CONTEXT 指定的目录。

3.解析命令行参数:
使用 minimist 模块解析命令行参数。
定义了一些布尔类型的选项,如 modern、report、open 等。
这些选项是命令行参数,用于配置和控制 vue-cli-service 的行为。以下是每个选项的作用:

构建相关选项:
modern:启用现代模式构建,生成现代 JavaScript 代码以利用新浏览器的特性。
report:生成构建报告,通常用于分析打包后的文件大小和依赖关系。
report-json:生成 JSON 格式的构建报告。
inline-vue:将 Vue 的运行时内联到构建的包中。
watch:在开发模式下监听文件变化,自动重新构建。

服务相关选项:
open:在启动开发服务器后自动打开浏览器
copy:将本地 URL 复制到剪贴板。
https:使用 HTTPS 协议启动开发服务器。

检查相关选项
verbose:启用详细模式,输出更详细的日志信息,通常用于调试。
这些选项可以通过命令行传递给 vue-cli-service,以便在开发和构建过程中自定义其行为。

4. 获取并运行命令:
从解析的参数中获取要执行的命令。
调用服务实例的 run 方法执行命令,并传递解析的参数
如果执行过程中出现错误,捕获错误并输出,然后终止进程。
Vue CLI 的一个入口脚本,用于根据用户输入的命令和参数启动相应的服务或构建任务

generator/路径下的index.js文件

Vue CLI 服务生成器的模块,主要用于根据用户的选项配置项目的模板和依赖。以下是代码的主要功能:
1.模板渲染:
使用 api.render 方法渲染项目模板,并根据是否安装了 Babel 或 TypeScript 插件来决定是否编译代码。

2. 依赖管理:
根据用户选择的 Vue 版本(Vue 2 或 Vue 3),设置相应的项目依赖。
如果是 Vue 2,还会添加 vue-template-compiler 作为开发依赖。

3.脚本和浏览器支持:
扩展 package.json,添加 serve 和 build 脚本,用于启动开发服务器和构建生产环境代码。
配置 browserslist,以支持特定市场份额的浏览器,并根据 Vue 版本决定是否支持 IE 11。

4.CSS 预处理器支持:
根据用户选择的 CSS 预处理器(如 Sass、Less、Stylus),添加相应的开发依赖。

5.Vue 3 兼容性:
如果用户选择了路由或 Vuex,但没有安装相应的插件,则引入默认的路由或 Vuex 配置。

6.额外工具配置:
如果用户提供了额外的配置选项,则将这些配置扩展到 package.json。

7. TypeScript 支持:
如果项目使用 TypeScript,则删除 jsconfig.json 文件,因为 TypeScript 项目通常使用 tsconfig.json。
这段代码的目的是根据用户的选择自动配置 Vue 项目,以便开发者可以快速启动项目开发。

module.exports = (api, options) => {// 渲染模板,判断是否使用 Babel 或 TypeScriptapi.render('./template', {doesCompile: api.hasPlugin('babel') || api.hasPlugin('typescript'),useBabel: api.hasPlugin('babel')})// 根据 Vue 版本设置依赖if (options.vueVersion === '3') {api.extendPackage({dependencies: {'vue': '^3.2.13' // Vue 3 版本}})} else {api.extendPackage({dependencies: {'vue': '^2.6.14' // Vue 2 版本},devDependencies: {'vue-template-compiler': '^2.6.14' // Vue 2 模板编译器}})}// 扩展 package.json 的脚本和浏览器列表api.extendPackage({scripts: {'serve': 'vue-cli-service serve', // 启动开发服务器'build': 'vue-cli-service build'  // 构建生产环境代码},browserslist: ['> 1%', // 支持市场份额大于 1% 的浏览器'last 2 versions', // 支持最新的两个版本'not dead', // 不支持已停止更新的浏览器...(options.vueVersion === '3' ? ['not ie 11'] : []) // Vue 3 不支持 IE 11]})// 根据选择的 CSS 预处理器添加相应的开发依赖if (options.cssPreprocessor) {const deps = {sass: {sass: '^1.32.7','sass-loader': '^12.0.0'},'dart-sass': {sass: '^1.32.7','sass-loader': '^12.0.0'},less: {'less': '^4.0.0','less-loader': '^8.0.0'},stylus: {'stylus': '^0.55.0','stylus-loader': '^6.1.0'}}api.extendPackage({devDependencies: deps[options.cssPreprocessor]})}// Vue 3 兼容性:如果选择了路由但没有安装插件,则引入路由配置if (options.router && !api.hasPlugin('router')) {require('./router')(api, options, options)}// Vue 3 兼容性:如果选择了 Vuex 但没有安装插件,则引入 Vuex 配置if (options.vuex && !api.hasPlugin('vuex')) {require('./vuex')(api, options, options)}// 额外的工具配置if (options.configs) {api.extendPackage(options.configs)}// 如果使用 TypeScript,删除 jsconfig.json 文件if (api.hasPlugin('typescript')) {api.render((files) => delete files['jsconfig.json'])}
}

cli-service\generator\template\src\App.vue 文件

这段代码是一个 Vue.js 应用程序的模板文件,通常用于生成一个新的 Vue.js 项目。以下是代码的主要作用和结构:

  1. 模板部分:
    根据 rootOptions.vueVersion 判断使用 Vue 3 还是 Vue 2。
    如果是 Vue 3,直接在根元素下显示 Vue 的 logo 和一个 HelloWorld 组件或欢迎标题。
    如果是 Vue 2,使用一个 div 包裹内容,显示 Vue 的 logo 和一个 HelloWorld 组件或欢迎标题。
    rootOptions.bare 用于判断是否显示 HelloWorld 组件或简单的欢迎标题。

  2. 脚本部分:
    导入 HelloWorld 组件。
    定义一个 Vue 组件,名称为 App,并注册 HelloWorld 组件。

  3. 样式部分:
    根据 rootOptions.cssPreprocessor 判断使用哪种 CSS 预处理器。
    如果不是 stylus,则根据选择的预处理器语言设置样式语言。
    定义了 #app 的样式,包括字体、文本对齐、颜色等。
    这段代码通过条件语句和模板语法,动态生成适合不同项目配置的 Vue.js 应用程序模板。

<template>
<%_ if (rootOptions.vueVersion === '3') { _%><img alt="Vue logo" src="./assets/logo.png"><%_ if (!rootOptions.bare) { _%><HelloWorld msg="Welcome to Your Vue.js App"/><%_ } else { _%><h1>Welcome to Your Vue.js App</h1><%_ } _%>
<%_ } else { _%><div id="app"><img alt="Vue logo" src="./assets/logo.png"><%_ if (!rootOptions.bare) { _%><HelloWorld msg="Welcome to Your Vue.js App"/><%_ } else { _%><h1>Welcome to Your Vue.js App</h1><%_ } _%></div>
<%_ } _%>
</template>
<%_ if (!rootOptions.bare) { _%><script>
import HelloWorld from './components/HelloWorld.vue'export default {name: 'App',components: {HelloWorld}
}
</script><%_ if (rootOptions.cssPreprocessor !== 'stylus') { _%>
<style<%-rootOptions.cssPreprocessor? ` lang="${rootOptions.cssPreprocessor.includes('sass')? 'scss': rootOptions.cssPreprocessor}"`: ``
%>>
#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 60px;
}
</style>
<%_ } else { _%>
<style lang="stylus">
#appfont-family Avenir, Helvetica, Arial, sans-serif-webkit-font-smoothing antialiased-moz-osx-font-smoothing grayscaletext-align centercolor #2c3e50margin-top 60px
</style>
<%_ } _%>
<%_ } _%>

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

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

相关文章

Ftrans数据跨境传输方案:保护隐私与促进合作

数据跨境传输是指在不同国家、地区和法律框架下进行的数据交换和传输&#xff0c;数据跨境传输流程周期是数据产生--数据传输--数据接收&#xff0c;而困境来源也来自这3个环节&#xff1a; 1.本地合规限制 数据出口国&#xff08;数据输出国&#xff09;的法律对于数据收集的…

Mybatis学习笔记(三)

十、MyBatis的逆向工程 (一)逆向工程介绍 MyBatis的一个主要的特点就是需要程序员自己编写sql&#xff0c;那么如果表太多的话&#xff0c;难免会很麻烦&#xff0c;所以mybatis官方提供了一个逆向工程&#xff0c;可以针对单表自动生成mybatis执行所需要的代码&#xff08;包…

Github 2024-11-08Java开源项目日报 Top9

根据Github Trendings的统计,今日(2024-11-08统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9Vue项目1经验丰富的Java(后端)开发人员核心面试问题和答案 | 互联网Java工程师进阶知识完全扫盲 创建周期:2085 天开发语言:Java协议…

【新闻文本分类识别】Python+CNN卷积神经网络算法+深度学习+人工智能+机器学习+文本处理

一、介绍 文本分类识别系统。本系统使用Python作为主要开发语言&#xff0c;首先收集了10种中文文本数据集&#xff08;“体育类”, “财经类”, “房产类”, “家居类”, “教育类”, “科技类”, “时尚类”, “时政类”, “游戏类”, “娱乐类”&#xff09;&#xff0c;然…

数据结构 ——— 链式二叉树的前中后序遍历递归实现

目录 前言 链式二叉树示意图​编辑 手搓一个链式二叉树 链式二叉树的前序遍历 链式二叉树的中序遍历 链式二叉树的后序遍历 前言 在上一章学习了链式二叉树的前中后序遍历的解析 数据结构 ——— 链式二叉树的前中后序遍历解析-CSDN博客 接下来要学习的是代码实现链式…

<项目代码>YOLOv8 pcb板缺陷检测<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

yarn报错`warning ..\..\package.json: No license field`:已解决

出现这个报错有两个原因 1、项目中没有配置许可证 在项目根目录package.json添加 {"name": "next-starter","version": "1.0.0",# 添加这一行"license": "MIT", }或者配置私有防止发布到外部仓库 {"priv…

大模型学习笔记------CLIP模型解读与思考

大模型学习笔记------CLIP模型详解 1、为什么提出CLIP模型2、CLIP模型详解3、CLIP模型的意义4、一些思考 上文说到&#xff0c;多模态大模型应该是非常有发展前景的&#xff0c;首先来学习 CLIP&#xff08;Contrastive Language-Image Pretraining&#xff09;这个多模态模型…

昇思25天学习打卡营第1天|快速入门

昇思25天学习打卡营第1天|快速入门 目录 昇思25天学习打卡营第1天|快速入门实操教程 一、MindSpore内容简介 主要特点&#xff1a; MindSpore的组成部分&#xff1a; 二、入门实操步骤 1. 安装必要的依赖包 2. 下载并处理数据集 3. 构建网络模型 4. 训练模型 5. 测试…

【Python TensorFlow】入门到精通

TensorFlow 是一个开源的机器学习框架&#xff0c;由 Google 开发&#xff0c;广泛应用于机器学习和深度学习领域。本篇将详细介绍 TensorFlow 的基础知识&#xff0c;并通过一系列示例来帮助读者从入门到精通 TensorFlow 的使用。 1. TensorFlow 简介 1.1 什么是 TensorFlow…

Python 学习完基础语法知识后,如何进一步提高?

入门Python后&#xff0c;就可以拿些小案例练手了&#xff0c;这时候千万不要傻乎乎地成天啃语法书。 编程是一门实践的手艺&#xff0c;讲究孰能生巧。不管是去手撸算法、或者照葫芦画瓢写几个小游戏都可以让你的Python突飞猛进。 之前看github比较多&#xff0c;推荐给大家…

Java:数据结构-再谈String类

字符串常量池 首先我们来思考这段代码&#xff0c;为什么运行结果一个是true&#xff0c;一个是false呢&#xff1f; public class Test {public static void main(String[] args) {String s1"123";String s2"123";String s3new String("555")…

书生第四期实训营基础岛——L1G2000 玩转书生「多模态对话」与「AI搜索」产品

基础任务 MindSearch使用示例 书生浦语使用示例 书生万象使用示例 进阶任务 问题&#xff1a;目前生成式AI在学术和工业界有什么最新进展&#xff1f; 回答截图&#xff1a; 知乎回答链接&#xff1a;目前生成式AI在学术和工业界有什么最新进展&#xff1f;

ReactPress:重塑内容管理的未来

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议&#xff0c;欢迎一起共建&#xff0c;感谢Star。 ReactPress&#xff1a;重塑内容管理的未来 在当今信息爆炸的时代&#xff0c;一个高效、易用的内容管理系统&#xff0…

短视频矩阵系统源码/抖去推源头技术4年开发

#短视频矩阵系统# #短视频矩阵系统源码# #短视频矩阵系统源码开发# #短视频矩阵系统源头技术开发# 抖音短视频矩阵系统集成开发是指利用抖音平台的开放接口和API&#xff0c;构建一个系统&#xff0c;该系统能够管理多个抖音矩阵账号&#xff0c;实现内容的统一发布、账号管理、…

CJ/T188-2004 报文举例

CJ/T188-2004 报文举例 # 读水表地址 # 请求报文&#xff1a; FE FE FE FE 68 AA AA AA AA AA AA AA AA 03 03 81 0A 00 49 16FE FE FE FE &#xff1a;前导字符 FE68 &#xff1a;起始字符AA &#xff1a;仪表类型AA AA AA AA AA AA AA &#xff1a;仪表地址&#xff08;当…

JavaEE进阶---第一个SprintBoot项目创建过程我的感受

文章目录 1.我的创建感受2.环境配置说明2.1xml文件国内源2.2配置流程 3.创建项目4.项目创建说明5.第一个程序--helloworld 1.我的创建感受 今天是学习这个spring boot项目创建的一天&#xff0c;这个确实过程坎坷&#xff0c;于是我自己决定弄一个这个IDEA的 专业版本&#xf…

7.1、实验一:RIPv1配置

一、源文件 7.1、实验一&#xff1a;RIPv1配置: https://url02.ctfile.com/d/61945102-63657205-d343fe?p2707 (访问密码: 2707) 二、实验目的 学会配置RIPv1路由 查看和调试RIPv1路由协议相关信息 三、实验要求 1.拓扑图 2. 四、开始实验 1.配置ip 配置R1 配置R2 配置…

【ARM Linux 系统稳定性分析入门及渐进 1.3 -- Crash工具编译过程】

文章目录 Build Procedure安装二进制 RPM从源代码重建构建过程从 tar 映像构建ARM 平台 Crash 工具安装从源 RPM 构建Build Procedure 从 RHEL3 版本开始,如果在系统安装时选择了开发工具包集(Development Tools),crash 工具会自动安装。然而,对于其他内核版本,或者如果…

【2023工业图像异常检测文献】GRAD: 基于异常生成和重权密集对比模式的异常检测方法

Generating and Reweighting Dense Contrastive Patterns for Unsupervised Anomaly Detection 1、Background 图像异常检测在各个领域扮演着至关重要的角色&#xff0c;包括工业产品缺陷检测、医学图像病变检测、使用X光图像的安全检查以及视频监控。 然而&#xff0c;由于无…