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 相关文章推荐
jquery 入门教程 [翻译] 推荐
Aug 17 Javascript
jquery next nextAll nextUntil siblings的区别介绍
Oct 05 Javascript
jquery $.fn $.fx是什么意思有什么用
Nov 04 Javascript
jQuery中:gt选择器用法实例
Dec 29 Javascript
jquery判断input值不为空的方法
Jun 05 Javascript
input获取焦点时底部菜单被顶上来问题的解决办法
Jan 24 Javascript
jQuery实现的简单拖动层示例
Feb 22 Javascript
微信小程序 http请求的session管理
Jun 07 Javascript
(模仿京东用户注册)用JQuery实现简单表单验证,初学者必看
Jan 08 jQuery
Vue 中mixin 的用法详解
Apr 23 Javascript
JQuery中的常用事件、对象属性与使用方法分析
Dec 23 jQuery
Jquery属性的获取/设置及样式添加/删除操作技巧分析
Dec 23 jQuery
使用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中常用字符串处理代码片段整理
2011/11/07 PHP
PHP 数组基本操作方法详解
2016/06/17 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
2019/12/13 PHP
更正确的asp冒泡排序
2007/05/24 Javascript
随机显示经典句子或诗歌的javascript脚本
2007/08/04 Javascript
jQuery find和children方法使用
2011/01/31 Javascript
juqery 学习之五 文档处理 插入
2011/02/11 Javascript
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
2014/08/16 Javascript
NodeJS学习笔记之Http模块
2015/01/13 NodeJs
javascript中var的重要性分析
2015/02/11 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
javascript trie前缀树的示例
2018/01/29 Javascript
解决layer弹层遮罩挡住窗体的问题
2018/08/17 Javascript
基于JS实现web端录音与播放功能
2019/04/17 Javascript
js实现简单的贪吃蛇游戏
2020/04/23 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
[40:01]OG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python写的一个简单监控系统
2015/06/19 Python
深入理解python中的闭包和装饰器
2016/06/12 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
2016/12/10 Python
动态规划之矩阵连乘问题Python实现方法
2017/11/27 Python
python画图--输出指定像素点的颜色值方法
2019/07/03 Python
pycharm修改文件的默认打开方式的步骤
2019/07/29 Python
python实现几种归一化方法(Normalization Method)
2019/07/31 Python
Python3 A*寻路算法实现方式
2019/12/24 Python
微信html5页面调用第三方位置导航的示例
2018/03/14 HTML / CSS
shell的种类有哪些
2015/04/15 面试题
宿舍保安职务说明书
2014/02/25 职场文书
幼儿园大班家长评语
2014/04/17 职场文书
公证委托书格式
2014/09/13 职场文书
基层干部个人对照检查及整改措施
2014/10/28 职场文书
研究生导师评语
2014/12/31 职场文书
swagger如何返回map字段注释
2021/07/03 Java/Android
关于mysql中string和number的转换问题
2022/06/14 MySQL
SpringBoot详解整合Redis缓存方法
2022/07/15 Java/Android