Vue脚手架创建的项目的启动流程

当利用vue脚手架创建项目之后利用 npm run serve 启动开发环境,我们就从这里来开始分析。

  • 入口分析

首先从package.json中的脚本配置来看,npm run serve调用的是vue-cli-service serve命令。

这个时候就应该来到node_modules中的.bin查找vue-cli-service.js文件。
但是在vue-cli-service.js文件中有一句代码const Service = require(’…/lib/Service’),但是根据这个路径是找不到这个文件的。那么这个文件在哪里呢?
其实真正入口在node_modules/@vue/cli-service/bin/vue-cli-service.js。

那在vue-cli-service.js中到底做了什么事呢?

核心逻辑:
1、初始化Service
const Service = require('../lib/Service')
const service = new Service(process.env.VUE_CLI_CONTEXT || process.cwd())2、调用service的run方法
service.run(command, args, rawArgv)
  • Service构造函数分析

1、初始化一些内置参数
2、读取package.json中的配置信息 this.resolvePkg(pkg)
3、读取插件信息 this.resolvePlugins(plugins, useBuiltIn)

this.resolvePlugins函数到底做了什么事呢?

1、加载builtInPlugins插件(比如当前目录下的’./commands/serve’,’./commands/build’等),然后把各个插件中导出的函数挂载到apply字段中


const idToPlugin = id => ({id: id.replace(/^.\//, 'built-in:'),apply: require(id)
})
let plugins
const builtInPlugins = ['./commands/serve','./commands/build','./commands/inspect','./commands/help',// config plugins are order sensitive'./config/base','./config/css','./config/prod','./config/app'
].map(idToPlugin)// 说明:apply等于各个插件中导出的函数
apply = module.exports = (api, options) => {}

2、加载package.json中devDependencies配置的插件,同样将导出的函数挂载到apply

const projectPlugins = Object.keys(this.pkg.devDependencies || {})
...

3、加载本地插件
4、合并所有插件并返回

plugins = builtInPlugins.concat(projectPlugins)
plugins = plugins.concat(files.map(file => ({id: `local:${file}`,apply: loadModule(`./${file}`, this.pkgContext)
})))

到这里构造函数做的事情已经完毕了。

  • Service.run方法分析

1、根据参数加载需要过滤的插件 this.setPluginsToSkip(args)
2、this.init(mode)
3、从this.commands中取出fn函数并执行

let command = this.commands[name]
const { fn } = command
return fn(args, rawArgv)

this.init(mode)方法详细分析:

1、根据mode读取环境配置this.loadEnv(mode)
2、读取基本的环境配置this.loadEnv()
3、loadUserOptions(),加载vue.config.js和vue.config.cjs中的配置
4、遍历所有插件然后执行

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

5、加载一些其他配置

apply(new PluginAPI(id, this), this.projectOptions)这个函数做了什么事情呢?
1、创建PluginAPI实例,传入插件名称和Service的实例
2、根据上面分析,apply()就是调用插件导出的函数

这里以第一个插件"./commands/serve"来分析说明:

// serve.js
api.registerCommand('serve', {},async function serve (args) {})// PluginAPI.js
registerCommand (name, opts, fn) {if (typeof opts === 'function') {fn = optsopts = null}this.service.commands[name] = { fn, opts: opts || {}}
}

serve插件调用apply()函数就是调用PluginAPI中的registerCommand函数。

1、根据以上第5步分析,this.service = Service
2、相当于在Service的commands对象中存储了一个"serve" = serve (args) {}键值对。

回到Service.run的最后一步就是执行的这里填入的方法。

serve插件为例:
fn(args, rawArgv) = async function serve (args) {}

那serve函数中就是一些关于开发环境中资源的加载、webpack的编译、WebpackDevServer的创建等的操作。

其他加载的插件也是这么分析的,可以根据不同文件的具体实现了解里面的操作。

终上所述:
下面是Vue脚手架项目启动过程解析思维导图

高清无码大图下载

Vue脚手架创建的项目的启动流程相关推荐

  1. Vue脚手架创建TS项目

    What is TS? TS语言,也就是TypeScript,是前端一个非常强大的语言超集,基于JavaScript. TS的强大吸引了许许多多的前端开发者学习使用. TS最大的特点,就是在JavaS ...

  2. Vue脚手架创建项目流程

    Vue脚手架创建项目流程 图形化创建 在创建文件的文件夹打开cmd, 按住shift右键打开黑窗口,或者直接在文件夹上面路径上面输入cmd 输入vue ui 会自己在浏览器打开 点击创建项目 项目文件 ...

  3. 【Vue】—Vue脚手架创建项目时的 linter / formatter config配置选择

    [Vue]-Vue脚手架创建项目时的 linter / formatter config配置选择 ESLint with error prevention only 只进行报错提醒 ESLint + ...

  4. 7004.vue脚手架快速生成项目

    文章目录 1 Vue脚手架可以快速生成Vue项目基础的架构. 1.1 安装3.x版本的Vue脚手架: 1.2基于3.x版本的脚手架创建Vue项目: 1.3 分析Vue脚手架生成的项目结构 2 vue脚 ...

  5. SSM项目的启动流程深入解析

    1 环境说明 本文的内容基于Tomcat9.0.10.Spring 4.3 2 Tomcat加载应用的顺序 在我们正式介绍SSM项目是怎么启动之前,我们要先来简单介绍一下Tomcat.很多人在介绍To ...

  6. nuxt 脚手架创建nuxt项目中不支持es6语法的解决方案

    nuxt 脚手架创建nuxt项目中不支持es6语法的解决方案 参考文章: (1)nuxt 脚手架创建nuxt项目中不支持es6语法的解决方案 (2)https://www.cnblogs.com/jk ...

  7. Vue 脚手架生成的项目结构分析||Vue 脚手架的自定义配置

    Vue 脚手架生成的项目结构分析 Vue 脚手架的自定义配置

  8. 基于脚手架创建react项目

    React(一)使用脚手架创建React项目: 转自: https://www.cnblogs.com/yulingjia/p/9583244.html D:\workbench_ws>npm ...

  9. Vue - vue+webpack创建的项目打包发布至服务器,页面空白及背景图片不显示问题解决

    vue+webpack创建的项目打包发布至服务器,页面空白及背景图片不显示问题解决 一. 页面显示空白 二. 背景图片不显示 一. 页面显示空白 解决方法: config > index.js ...

最新文章

  1. 我的第一个bada项目上线了【附源码下载】
  2. 基于ubuntu16.04多用户编译android N(android 7.1)系统提示ninja_wrapper错误问题
  3. python颜色形状识别_Python自定义颜色形状Fi
  4. 查看wcf服务中方法测试客户端
  5. 小程序 mpvue 生命周期一览
  6. DeepMind 用 GAN 虚构视频真假难辨【智能行业热点】(2019.7.22)
  7. 如何删除旧的和未使用的Docker映像
  8. Tomcat 7 Connector 精读(2) 协议处理器 Http11Protocol(待续)
  9. 【运量预测】基于matlab BP神经网络公路运量预测【含Matlab源码 413期】
  10. 《商务与经济统计》学习笔记(一)---数据与统计资料
  11. 微信小程序——使用加速计实现水平仪功能,另介绍一款硬件数据监听工具(加速计、陀螺仪、设备方向)
  12. 分类预测 | Matlab实现SSA-SVM麻雀算法优化支持向量机多特征分类预测
  13. thinkphp5 layui分页样式
  14. 4 年 Java 程序员十面阿里终拿下 offer,评级 P6+ 年薪 30-40w 无股票
  15. python requests post 二进制流_Python的requests如何同时post图片二进制流和json数据application/octet-stream...
  16. Android 智能硬件的理解(2018.5.25)
  17. 520谁才是你的真爱?
  18. 【干货】抖音、快手、火山短视频去水印软件使用介绍
  19. 阿里云超级码力第二场记录
  20. 数据仓库-你不知道的HSQL?

热门文章

  1. mysql数据库权限查询_mysql数据库权限管理
  2. 基于opencv实现对图片中的物体计数
  3. 国内,美国数学专业排名
  4. coalesce()
  5. Unity Shader Graph 制作Dissolve溶解效果
  6. 推荐一个经济学方面的论坛:人大经济论坛
  7. UG\NX二次开发 创建工程图注释
  8. 关于微博开放平台Oauth2.0接入网站应用
  9. 大数据征信 是伪命题?还是金融行业的救世主?
  10. 服务器内存1600显示1066,解答为什么1066内存只认到800