关于晚上十点和男生朋友打电话调试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!

相关推荐
moxiaoran57533 小时前
uni-app萌宠案例学习笔记--页面布局和CSS样式设置
前端·css·uni-app
CrissChan4 小时前
Pycharm 函数注释
java·前端·pycharm
小小小小宇4 小时前
Vue.nextTick()笔记
前端
小约翰仓鼠6 小时前
vue3子组件获取并修改父组件的值
前端·javascript·vue.js
Lin Hsüeh-ch'in6 小时前
Vue 学习路线图(从零到实战)
前端·vue.js·学习
烛阴6 小时前
bignumber.js深度解析:驾驭任意精度计算的终极武器
前端·javascript·后端
计蒙不吃鱼6 小时前
一篇文章实现Android图片拼接并保存至相册
android·java·前端
全职计算机毕业设计7 小时前
基于Java Web的校园失物招领平台设计与实现
java·开发语言·前端
啊~哈7 小时前
vue3+elementplus表格表头加图标及文字提示
前端·javascript·vue.js