关于晚上十点和男生朋友打电话调试vue源码那些事

简介

朋友昨晚让我帮忙看怎么调试vue源码,我当时就不困了啊。兴致勃勃搞了半小时以失败告终。小白我可是永不言败的,早上鼓捣了俩小时总算写了点东西出来。想调试vue源码的小伙伴可以试试我这个思路

fork源码

首先肯定是要把vue/core代码fork一份到自己的仓库 这样后续有改动可以提交一下 也可以从源码一键同步

ps:github.com/baicie/vuej... 我的代码在这里可以参考一下

装包

bash 复制代码
pnpm i @pnpm/find-workspace-packages @pnpm/types -wD

ps:可以先看看pnpm与monorepo

在根目录执行上述命令装一下依赖-wD含义是在workspace的根安装开发依赖

脚本编写

首先在packages下执行pnpm creata vite创建一个vue项目

然后在scripts文件夹下创建dev.ts

ts 复制代码
import type { Project as PnpmProject } from '@pnpm/find-workspace-packages'
import { findWorkspacePackages } from '@pnpm/find-workspace-packages'
import type { ProjectManifest } from '@pnpm/types'
import { execa } from 'execa'
import os from 'node:os'
import path from 'node:path'
import process from 'node:process'
import color from 'picocolors'
import { scanEnums } from './const-enum'

export type Manifest = ProjectManifest & {
  buildOptions: {
    name?: string
    compat?: boolean
    env?: string
    formats: ('global' | 'cjs' | 'esm-bundler' | 'esm-browser')[]
  }
}

interface Project extends PnpmProject {
  manifest: Manifest
}

const pkgsPath = path.resolve(process.cwd(), 'packages')
const getWorkspacePackages = () => findWorkspacePackages(pkgsPath)

async function main() {
  scanEnums()
  // 获取所有的包 除了private与没有buildOptions的包
  const pkgs = (
    (await getWorkspacePackages()).filter(
      item => !item.manifest.private
    ) as Project[]
  ).filter(item => item.manifest.buildOptions)

  await buildAll(pkgs)
}

async function buildAll(target: Project[]) {
  // 并行打包
  return runParallel(Number.MAX_SAFE_INTEGER, target, build)
}

async function runParallel(
  maxConcurrent: number,
  source: Project[],
  buildFn: (project: Project) => void
) {
  const ret: Promise<void>[] = []
  const executing: Promise<void>[] = []
  for (const item of source) {
    const p = Promise.resolve().then(() => buildFn(item))
    // 封装所有打包任务
    ret.push(p)

    //
    if (maxConcurrent <= source.length) {
      const e: any = p.then(() => executing.splice(executing.indexOf(e), 1))
      executing.push(e)
      if (executing.length >= maxConcurrent) await Promise.race(executing)
    }
  }

  return Promise.all(ret)
}

async function build(project: Project) {
  const pkg = project.manifest
  // 获取相对路径 包名
  const target = path.relative(pkgsPath, project.dir)
  if (pkg.private) {
    return
  }

  const env = (pkg.buildOptions && pkg.buildOptions.env) || 'development'
  await execa(
    'rollup',
    [
      `-c`,
      // 给rollup配置文件传递参数 watch 监听文件变化
      '--watch',
      '--environment',
      [`NODE_ENV:${env}`, `TARGET:${target}`, `SOURCE_MAP:true`]
        .filter(Boolean)
        .join(',')
    ],
    { stdio: 'inherit' }
  )
}

main().catch(err => {
  console.error(color.red(err))
})

然后在根目录的package.json scripts 添加如下

"my-dev": "tsx scripts/dev.ts"

上述脚本主要是为了扫描工作目录下所有有意义的包并执行rollup打包命令(主要也就为了加一下watch没毛病)

验证

终端打开上吗创建的vite项目然后修改package.json里面的vue

"vue": "workspace:*"

修改后根目录执行pnpm i建立软连接

1.根目录终端执行pnpm run my-dev

2.vite-project执行pnpm run dev

3.去runtime-core/src/apiCreateApp.ts createAppAPI 的 createApp 方法加一句打印

4.等待根目录终端打包完毕

5.去看看浏览器控制台有没有打印

按理说走完上述流出应该有打印出来哈哈

优化更快?

然后就是想要快点因为我电脑不太行每次修改要等1.5~2s,然后我就想到了turbo,看了官网发现可行就试了试

修改如下

  1. pnpm i turbo -wD

  2. 修改上述的my-dev "my-dev": "tsx scripts/dev.ts --turbo"

  3. 启动并验证

快了一点但不多

最后

新人多多关照哈哈 如果你想变强 b站 掘金搜索小满zs!

相关推荐
计算机学姐1 分钟前
基于SpringBoot+Vue的篮球馆会员信息管理系统
java·vue.js·spring boot·后端·mysql·spring·mybatis
小白小白从不日白7 分钟前
react 高阶组件
前端·javascript·react.js
程序员大金14 分钟前
基于SpringBoot+Vue+MySQL的智能物流管理系统
java·javascript·vue.js·spring boot·后端·mysql·mybatis
Mingyueyixi31 分钟前
Flutter Spacer引发的The ParentDataWidget Expanded(flex: 1) 惨案
前端·flutter
徐同保1 小时前
vue 在线预览word和excel
vue.js·word·excel
Rverdoser1 小时前
unocss 一直热更新打印[vite] hot updated: /__uno.css
前端·css
Bang邦2 小时前
使用nvm管理Node.js多版本
前端·node.js·node多版本管理
podoor2 小时前
wordpress不同网站 调用同一数据表
前端·wordpress
LJ小番茄2 小时前
Vue 常见的几种通信方式(总结)
前端·javascript·vue.js·html
黑狼传说2 小时前
前端项目优化:极致最优 vs 相对最优 —— 深入探索与实践
前端·性能优化