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 相关文章推荐
添加到收藏夹代码(兼容几乎所有的浏览器)
Jan 09 Javascript
基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法
May 10 Javascript
Bootstrap表单布局
Jul 19 Javascript
jQuery实现的表格展开伸缩效果实例
Sep 07 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
Oct 19 Javascript
BootStrap daterangepicker 双日历控件
Jun 02 Javascript
angularJs的ng-class切换class
Jun 23 Javascript
Vue全家桶实践项目总结(推荐)
Nov 04 Javascript
使用Vue.js和Element-UI做一个简单登录页面的实例
Feb 23 Javascript
JS实现监控微信小程序的原理
Jun 15 Javascript
vue debug 二种方法
Sep 16 Javascript
React四级菜单的实现
Apr 08 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
PHP中将字符串转化为整数(int) intval() printf() 性能测试
2020/03/20 PHP
自己在做项目过程中学到的PHP知识收集
2012/08/20 PHP
php通过文件头判断格式的方法
2016/05/28 PHP
yii2 url重写并隐藏index.php方法
2018/12/10 PHP
jQuery 源码分析笔记(7) Queue
2011/06/19 Javascript
纯javascript判断查询日期是否为有效日期
2015/08/24 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
2016/07/05 Javascript
knockoutjs动态加载外部的file作为component中的template数据源的实现方法
2016/09/01 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
2017/02/21 Javascript
NodeJS父进程与子进程资源共享原理与实现方法
2018/03/16 NodeJs
深入理解Vue Computed计算属性原理
2018/05/29 Javascript
基于vue展开收起动画的示例代码
2018/07/05 Javascript
[01:14]DOTA2 7.22版本新增神杖效果展示(智力英雄篇)
2019/05/29 DOTA
go和python调用其它程序并得到程序输出
2014/02/10 Python
python 多线程实现检测服务器在线情况
2015/11/25 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
2016/06/16 Python
Python单例模式的两种实现方法
2017/08/14 Python
python3+mysql查询数据并通过邮件群发excel附件
2018/02/24 Python
将字典转换为DataFrame并进行频次统计的方法
2018/04/08 Python
对Tensorflow中权值和feature map的可视化详解
2018/06/14 Python
Django 路由系统URLconf的使用
2018/10/11 Python
python实现用户名密码校验
2020/03/18 Python
Python本地及虚拟解释器配置过程解析
2020/10/13 Python
详解Pytorch显存动态分配规律探索
2020/11/17 Python
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
iframe与window.onload如何使用详解
2020/05/07 HTML / CSS
法学专业应届生求职信
2013/10/16 职场文书
聘任书的写作格式及范文
2014/03/29 职场文书
公务员四风问题对照检查材料整改措施
2014/09/26 职场文书
历史名人教你十五个读书方法,赶快Get起来!
2019/07/18 职场文书
导游词之山东红叶谷
2019/10/31 职场文书
Java内存模型之happens-before概念详解
2021/06/13 Java/Android
React如何创建组件
2021/06/27 Javascript
Python借助with语句实现代码段只执行有限次
2022/03/23 Python
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript