Vue3.x源码调试的实现方法


Posted in Javascript onOctober 13, 2019

几句话说下我看源码的方式

断点调试

根据demo小例子或者api的使用姿势进行调试,每个小例子只关心其走过的逻辑分支。

如何调试vue3.x的ts源码

  • 官网说使用 yarn dev 命令就可以对其进行调试,可是运行该命令后,是生成过后的代码,不能对其编写的ts源码进行调试。
  • 其实再生成对应的sourcemap文件,便可以原汁原味的调试。
  • 先看下几个截图:

Vue3.x源码调试的实现方法 

Vue3.x源码调试的实现方法

如果这是你想要的调试效果,下面请看下如何生成sourcemap文件。

生成sourcemap文件

rollup.js中文文档

// rollup.config.js
export default {
 // 核心选项
 input,   // 必须
 external,
 plugins,

 // 额外选项
 onwarn,

 // danger zone
 acorn,
 context,
 moduleContext,
 legacy

 output: { // 必须 (如果要输出多个,可以是一个数组)
  // 核心选项
  file,  // 必须
  format, // 必须
  name,
  globals,

  // 额外选项
  paths,
  banner,
  footer,
  intro,
  outro,
  sourcemap,
  sourcemapFile,
  interop,

  // 高危选项
  exports,
  amd,
  indent
  strict
 },
};

可以看到output对象有个sourcemap属性,其实只要配置上这个就能生成sourcemap文件了。 在vue-next项目中的rollup.config.js文件中,找到createConfig函数

function createConfig(output, plugins = []) {
 const isProductionBuild =
  process.env.__DEV__ === 'false' || /\.prod\.js$/.test(output.file)
 const isGlobalBuild = /\.global(\.prod)?\.js$/.test(output.file)
 const isBunlderESMBuild = /\.esm\.js$/.test(output.file)
 const isBrowserESMBuild = /esm-browser(\.prod)?\.js$/.test(output.file)

 if (isGlobalBuild) {
  output.name = packageOptions.name
 }

 const shouldEmitDeclarations =
  process.env.TYPES != null &&
  process.env.NODE_ENV === 'production' &&
  !hasTSChecked

 const tsPlugin = ts({
  check: process.env.NODE_ENV === 'production' && !hasTSChecked,
  tsconfig: path.resolve(__dirname, 'tsconfig.json'),
  cacheRoot: path.resolve(__dirname, 'node_modules/.rts2_cache'),
  tsconfigOverride: {
   compilerOptions: {
    declaration: shouldEmitDeclarations,
    declarationMap: shouldEmitDeclarations
   },
   exclude: ['**/__tests__']
  }
 })
 // we only need to check TS and generate declarations once for each build.
 // it also seems to run into weird issues when checking multiple times
 // during a single build.
 hasTSChecked = true

 const externals = Object.keys(aliasOptions).filter(p => p !== '@vue/shared')

 output.sourcemap = true // 这句话是新增的
 return {
  input: resolve(`src/index.ts`),
  // Global and Browser ESM builds inlines everything so that they can be
  // used alone.
  external: isGlobalBuild || isBrowserESMBuild ? [] : externals,
  plugins: [
   json({
    namedExports: false
   }),
   tsPlugin,
   aliasPlugin,
   createReplacePlugin(
    isProductionBuild,
    isBunlderESMBuild,
    isGlobalBuild || isBrowserESMBuild
   ),
   ...plugins
  ],
  output,
  onwarn: (msg, warn) => {
   if (!/Circular/.test(msg)) {
    warn(msg)
   }
  }
 }
}

加上一句output.sourcemap = true即可。 然后运行 yarn dev,可以看到vue/dist/vue.global.js.map文件已生成。 再然后你在xxx.html通过script的方式引入vue.global.js文件,即可调试, 效果如上图。

弱弱的说一句,我对ts和rollup.js不熟,几乎陌生,但是不影响学习vue3.x源码。 vue3.x的源码这次分几个模块编写的,所以学习也可以分模块学习,比如学习响应式系统,运行yarn dev reactivity命令生成对应文件,然后配合__tests__下的案列,自己进行调试学习。(额,好像说了好几句...)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript屏蔽右键代码
May 15 Javascript
jquery实现倒计时代码分享
Jun 13 Javascript
JS表格组件神器bootstrap table详解(基础版)
Dec 08 Javascript
原生js和jQuery实现淡入淡出轮播效果
Dec 25 Javascript
输入框点击时边框变色效果的实现方法
Dec 26 Javascript
js a标签点击事件
Mar 30 Javascript
D3.js实现简洁实用的动态仪表盘的示例
Apr 04 Javascript
mpvue构建小程序的方法(步骤+地址)
May 22 Javascript
打通前后端构建一个Vue+Express的开发环境
Jul 17 Javascript
基于Vue+element-ui 的Table二次封装的实现
Jul 20 Javascript
node.js中npm包管理工具用法分析
Feb 14 Javascript
微信小游戏中three.js离屏画布的示例代码
Oct 12 Javascript
使用webpack将ES6转化ES5的实现方法
Oct 13 #Javascript
vue中uni-app 实现小程序登录注册功能
Oct 12 #Javascript
Jquery 动态添加元素并添加点击事件实现过程解析
Oct 12 #jQuery
微信小程序 scroll-view 水平滚动实现过程解析
Oct 12 #Javascript
微信小程序iOS下拉白屏晃动问题解决方案
Oct 12 #Javascript
vue中添加与删除关键字搜索功能
Oct 12 #Javascript
jquery 遍历hash操作示例【基于ajax交互】
Oct 12 #jQuery
You might like
PHP7原生MySQL数据库操作实现代码
2020/07/03 PHP
BOOM vs RR BO5 第一场 2.14
2021/03/10 DOTA
js时间比较示例分享(日期比较)
2014/03/05 Javascript
JQuery+CSS实现图片上放置按钮的方法
2015/05/29 Javascript
JS基于面向对象实现的拖拽功能示例
2016/12/20 Javascript
尝试自己动手用react来写一个分页组件(小结)
2018/02/09 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
2019/04/20 Javascript
详解如何在vue项目中使用layui框架及采坑
2019/05/05 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
使用JS location实现搜索框历史记录功能
2019/12/23 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
[03:48]DOTA2完美大师赛主赛事第二日精彩集锦
2017/11/24 DOTA
[33:15]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VP VS Mineski
2018/03/31 DOTA
Python魔术方法详解
2015/02/14 Python
python简单线程和协程学习心得(分享)
2017/06/14 Python
python实现TF-IDF算法解析
2018/01/02 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
Django Form 实时从数据库中获取数据的操作方法
2019/07/25 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
python实现图像拼接
2020/03/05 Python
详解PyQt5信号与槽的几种高级玩法
2020/03/24 Python
python自动提取文本中的时间(包含中文日期)
2020/08/31 Python
python如何运行js语句
2020/09/09 Python
html5贪吃蛇游戏使用63行代码完美实现
2013/06/25 HTML / CSS
Timberland美国官网:全球领先的户外品牌
2016/08/15 全球购物
西班牙手机之家:Phone House
2018/10/18 全球购物
VisionPros美国站:加拿大在线隐形眼镜和眼镜零售商
2020/02/11 全球购物
介绍一下Ruby中的对象,属性和方法
2012/07/11 面试题
五年级科学教学反思
2014/02/05 职场文书
门前三包责任书
2014/04/15 职场文书
高三励志标语
2014/06/05 职场文书
汽车销售经理岗位职责
2014/06/09 职场文书
反腐倡廉剖析材料
2014/09/30 职场文书
内勤岗位职责
2015/02/10 职场文书
反邪教警示教育活动总结
2015/05/09 职场文书
读《教育心理学》心得体会
2016/01/22 职场文书