Vue进阶之Vue CLI服务—@vue/cli-service & Vuex

@vue/cli-service

初识

第一块是上一个讲述的cli是把我们代码的配置项,各种各样的插件,npm包给你装好
第二块是这里的cli-service包是提供webpack配置

在cli的Creator中已经内置好了@vue/cli-service,就已经包含了cli-service这部分的webpack的配置

还是先看cli-service的package.json找到bin的入口文件

在这里插入图片描述

bin/vue-cli-service.js

代码执行

pnpm i

node vue-cli-service.js

在这里插入图片描述

解读

//首先引入service
const Service = require('../lib/Service')
//基于Service构造函数创建实例
const service = new Service(process.env.VUE_CLI_CONTEXT || process.cwd())

const rawArgv = process.argv.slice(2)
//类似于代码压缩的效果,将无用的空格去掉,比如,vue-cli-service build --a     --b  --c 
const args = require('minimist')(rawArgv, {
  boolean: [
    // build
    // FIXME: --no-module, --no-unsafe-inline, no-clean, etc.
    'modern',
    'report',
    'report-json',
    'inline-vue',
    'watch',
    // serve
    'open',
    'copy',
    'https',
    // inspect
    'verbose'
  ]
})
const command = args._[0]

service.run(command, args, rawArgv).catch(err => {
  error(err)
  process.exit(1)
})

平常npm run serve,npm run dev就是执行的是 vue-cli-service serve 和 vue-cli-service dev,最终真正执行的是 node bin/vue-cli-service.js run serve,本质上也就是Commander

run执行的代码,本质上就是针对webpack定制化,或者说webpack配置化的一个能力

async run (name, args = {}, rawArgv = []) {
    // resolve mode
    // prioritize inline --mode
    // fallback to resolved default modes from plugins or development if --watch is defined
    const mode = args.mode || (name === 'build' && args.watch ? 'development' : this.modes[name])

    // --skip-plugins arg may have plugins that should be skipped during init()
    this.setPluginsToSkip(args, rawArgv)

    // load env variables, load user config, apply plugins
    await this.init(mode)

    args._ = args._ || []
    let command = this.commands[name]
    if (!command && name) {
      error(`command "${name}" does not exist.`)
      process.exit(1)
    }
    if (!command || args.help || args.h) {
      command = this.commands.help
    } else {
      args._.shift() // remove command itself
      rawArgv.shift()
    }
    const { fn } = command
    return fn(args, rawArgv)
  }

而cli-service包就是创建webpack的过程,generator中的内容就是怎么去封装webpack.config.js的过程
在这里插入图片描述

下面的这个就是通过vue-cli创建的默认的模板,里面有标识符,就是ejs模板化语言,在开发中称之为生成模板的过程,使用的就是ejs(嵌入式的js)
在这里插入图片描述

Vuex

以Vuex为例,只要提供generator能力,我们就能使用插件化的能力给解析好

generator/index.js

  • vue-cli
    • packages
      • @vue
        • cli-plugin-vuex
          • generator
            • index.js

在这里插入图片描述

store/index.js

  • vue-cli
    • packages
      • @vue
        • cli-plugin-vuex
          • generator
            • template-vue3
              • src
                • store
                  • index.js

这里对应的就是Vue中Vuex的用法

import { createStore } from 'vuex'

export default createStore({
  state: {
  },
  getters: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})

  • vue-cli
    • packages
      • @vue
        • cli-plugin-vuex
          • index.js

这里是一个入口的返回

module.exports = (api, options = {}) => {}

目的就是能够使用插件化的能力将其引入进去

vue add vuex

使用这样的命令实现插件化的能力

插件化的能力怎么引入呢?

vue add vuex

  • vue-cli
    • packages
      • @vue
        • cli
          • bin
            • vue.js

add是通过引入lib下的add文件来添加插件的

program
  .command('add <plugin> [pluginOptions]')
  .description('install a plugin and invoke its generator in an already created project')
  .option('--registry <url>', 'Use specified npm registry when installing dependencies (only for npm)')
  .allowUnknownOption()
  .action((plugin) => {
    require('../lib/add')(plugin, minimist(process.argv.slice(3)))
  })

add这里就是安装一个npm包的过程

  • vue-cli
    • packages
      • @vue
        • cli
          • lib
            • add.js
  1. 判断service的package.json
const servicePkg = loadModule('@vue/cli-service/package.json', context)
  if (servicePkg && semver.satisfies(servicePkg.version, '3.x')) {
    // special internal "plugins"
    if (/^(@vue\/)?router$/.test(pluginToAdd)) {
      return addRouter(context)
    }
    if (/^(@vue\/)?vuex$/.test(pluginToAdd)) {
      return addVuex(context)
    }
  }
  1. 安装上面说到的service的包
  log()
  log(`📦  Installing ${chalk.cyan(packageName)}...`)
  log()

  const pm = new PackageManager({ context })

  if (pluginVersion) {
    await pm.add(`${packageName}@${pluginVersion}`)
  } else if (isOfficialPlugin(packageName)) {
    const { latestMinor } = await getVersions()
    await pm.add(`${packageName}@~${latestMinor}`)
  } else {
    await pm.add(packageName, { tilde: true })
  }
  1. 然后找目录下的generator,生成generator目录下的文件
log(`${chalk.green('✔')}  Successfully installed plugin: ${chalk.cyan(packageName)}`)
  log()

  const generatorPath = resolveModule(`${packageName}/generator`, context)
  if (generatorPath) {
    invoke(pluginName, options, context)
  } else {
    log(`Plugin ${packageName} does not have a generator to invoke`)
  }
&lt;think&gt;嗯,用户想排查Vue项目依赖树中的问题,特别是@vue/cli-plugin-babel、@vue/cli-plugin-pwa和@vue/cli-service的版本冲突或潜在问题。首先,我需要回忆Vue CLI项目结构以及这些插件的兼容性。 首先,Vue CLI使用semver版本控制,主版本号需要一致。比如,如果@vue/cli-service是4.x,那么其他插件也应该用4.x。用户提到的三个插件都属于核心插件,版本必须与CLI服务一致。所以第一步应该检查package.json中这些插件的版本是否匹配。 接下来,用户可能需要运行npm ls或yarn list来查看依赖树,确认是否有不同版本的Vue CLI相关包。如果有,可能需要更新或降级某些包。比如,使用npm update命令更新到兼容版本,或者手动指定版本号安装。 另外,vue-cli-service的版本可能影响整个项目的构建,如果用户升级了Vue CLI但没有更新插件,就会出问题。这时需要检查全局和本地的CLI版本是否一致,避免因为全局安装的旧版本导致本地项目使用错误版本。 还可能存在依赖冲突,比如其他第三方库依赖不同版本的babel或webpack,这时候需要查看警告信息,用npm install --force或yarn install --force覆盖,或者手动解决冲突。 用户提供的引用中提到了使用全局安装Vue CLI,所以需要确认项目本地是否安装了正确版本,避免全局和本地版本不一致的问题。比如,全局安装了最新版,但项目用的是旧版,这时候可能需要卸载全局的,或者在项目内重新安装。 另外,引用[4]提到了Jest配置,如果用户使用了测试相关的插件,可能也需要检查相关依赖是否兼容。不过用户的问题主要集中在babel、pwa和cli-service上,可能暂时不需要处理测试部分。 最后,建议用户检查Vue的官方文档,确保所有插件的版本符合要求,或者使用Vue UI可视化工具来管理依赖,这样更直观。如果问题依旧,可能需要清除node_modules和lock文件,重新安装依赖。&lt;/think&gt;### Vue项目依赖树问题排查指南 #### 一、版本兼容性检查 1. **核心依赖关系** Vue CLI生态中`@vue/cli-service`是核心服务,`@vue/cli-plugin-*`插件必须与其主版本匹配。例如: $$ \text{@vue/cli-service@5.x} \Rightarrow \text{@vue/cli-plugin-babel@5.x} $$ 建议通过以下命令验证版本: ```bash npm list @vue/cli-service @vue/cli-plugin-babel @vue/cli-plugin-pwa ``` 2. **Vue CLI全局与本地版本冲突** 若全局安装的Vue CLI版本(如6.x)与项目本地版本(如5.x)不一致,可能导致依赖树混乱[^2]。可通过以下命令统一版本: ```bash npm uninstall -g @vue/cli # 卸载旧全局版本 npm install -g @vue/cli@5 # 安装指定版本 ``` #### 二、依赖树分析工具 1. **使用npm/yarn内置命令** ```bash npm ls --depth=5 # 显示依赖树前5层 yarn why @vue/cli-plugin-babel # 查看特定依赖来源 ``` 2. **可视化工具** 运行`vue ui`打开Vue项目管理器,通过图形界面查看依赖关系[^3]。 #### 三、常见冲突场景 | 冲突类型 | 表现示例 | 解决方案 | |---------|---------|---------| | **主版本不匹配** | `@vue/cli-service@5.0.8`与`@vue/cli-plugin-babel@4.5.19`共存 | 统一升级到5.x版本:`npm update @vue/cli-plugin-babel@5` | | **子依赖冲突** | `webpack`版本被不同插件强制锁定(如PWA插件依赖旧版) | 使用`npm install --force`或调整插件版本 | | **全局污染** | 全局安装的`vue-cli`与本地`@vue/cli`混合使用 | 彻底卸载旧版`vue-cli`:`npm uninstall -g vue-cli` | #### 四、操作示例 ```bash # 分步更新依赖 npm install @vue/cli-service@5.0.8 --save-exact npm install @vue/cli-plugin-babel@5.0.8 --save-dev npm install @vue/cli-plugin-pwa@5.0.8 --save-dev # 清理后重新安装 rm -rf node_modules package-lock.json npm install ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值