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 & DHTML 实例编程(教程)基础知识
Jun 02 Javascript
js 深拷贝函数
Dec 04 Javascript
Extjs grid添加一个图片状态或者按钮的方法
Apr 03 Javascript
javascript中对Date类型的常用操作小结
May 19 Javascript
Angular学习笔记之angular的$filter服务浅析
Nov 12 Javascript
js通过指定下标或指定元素进行删除数组的实例
Jan 12 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
Jan 09 Javascript
vue项目中使用百度地图的方法
Jun 08 Javascript
Vue-cli3项目配置Vue.config.js实战记录
Jul 29 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
Sep 20 jQuery
jquery使用FormData实现异步上传文件
Oct 25 jQuery
JavaScript实现图片放大预览效果
Nov 02 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实现对站点内容外部链接的过滤方法
2014/09/10 PHP
php模拟用户自动在qq空间发表文章的方法
2015/01/07 PHP
php实现无限级分类(递归方法)
2015/08/06 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
广告显示判断
2006/08/31 Javascript
javascript学习之闭包分析
2010/12/02 Javascript
JavaScript中的继承方式详解
2015/02/11 Javascript
基于jQuery实现点击弹出层实例代码
2016/01/01 Javascript
开源免费天气预报接口API及全国所有地区代码(国家气象局提供)
2016/12/26 Javascript
javascript基础知识讲解
2017/01/11 Javascript
jquery dataTable 获取某行数据
2017/05/05 jQuery
layer.open关闭父窗口 以及调用父页面的方法
2018/08/17 Javascript
基于vue中keep-alive缓存问题的解决方法
2018/09/21 Javascript
JavaScript ES6 Class类实现原理详解
2020/05/08 Javascript
JavaScript实现Tab标签页切换的最简便方式(4种)
2020/06/28 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
2020/08/27 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
2020/11/24 Javascript
vue3使用vue-count-to组件的实现
2020/12/25 Vue.js
python小技巧之批量抓取美女图片
2014/06/06 Python
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
Python数据分析之双色球中蓝红球分析统计示例
2018/02/03 Python
Python数据类型之Tuple元组实例详解
2019/05/08 Python
python用线性回归预测股票价格的实现代码
2019/09/04 Python
python超时重新请求解决方案
2019/10/21 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
2019/10/24 Python
python实现手势识别的示例(入门)
2020/04/15 Python
Python爬虫开发与项目实战
2020/12/16 Python
css3弹性盒模型实例介绍
2013/05/27 HTML / CSS
Stuarts London美国/加拿大:世界领先的独立男装零售商之一
2019/03/18 全球购物
说出你对remoting 和webservice的理解和应用
2014/06/08 面试题
优秀的毕业生的自我评价
2013/12/12 职场文书
《自选商场》教学反思
2014/02/14 职场文书
个人校本研修方案
2014/05/26 职场文书
领导干部作风整顿剖析材料
2014/10/11 职场文书
启动Tomcat时出现大量乱码的解决方法
2021/06/21 Java/Android