├── .babelrc
├── .circleci
└── config.yml
├── .eslintignore
├── .eslintrc
├── .flowconfig
├── .gitignore
├── .prettierrc
├── CHANGELOG.md
├── LICENSE
├── README.md
├── assets
├── base.jpg
├── com.jpg
├── data.jpg
├── element-ui.css
├── element-ui.js
├── erweima.jpg
├── event.jpg
├── feixiangjiance.jpg
├── fonts
│ └── element-icons.woff
├── nav.jpg
├── screenshot.jpg
├── show.mov
├── show.mp4
├── video.jpg
└── viewBar.jpg
├── build
├── build.js
├── configs.js
└── rollup.dev.config.js
├── dist
├── vue-component-inspector.common.js
├── vue-component-inspector.esm.browser.js
├── vue-component-inspector.esm.browser.min.js
├── vue-component-inspector.esm.js
├── vue-component-inspector.js
├── vue-component-inspector.js.map
├── vue-component-inspector.js.rej
└── vue-component-inspector.min.js
├── examples
└── basic
│ └── index.html
├── netlify.toml
├── package.json
├── scripts
├── release.sh
└── verifyCommitMsg.js
├── src
├── components
│ ├── basic.vue
│ ├── data.vue
│ ├── dataItem.vue
│ ├── event.vue
│ ├── index.vue
│ ├── navigation.vue
│ └── treeLoading.vue
├── config.js
├── helper
│ ├── event.js
│ ├── imgs.js
│ └── label.js
├── index.js
├── install.js
├── page
│ ├── contaienr-01.vue
│ ├── contaienr-02.vue
│ ├── contaienr-03.vue
│ └── page.vue
└── util
│ ├── dom.js
│ └── util.js
└── yarn.lock
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | "@babel/preset-env",
4 | "@vue/babel-preset-jsx"
5 | ]
6 | }
--------------------------------------------------------------------------------
/.circleci/config.yml:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zglz/vue-component-inspector/afcad8da6cd8b7ff3e3c714428c718fedf104523/.circleci/config.yml
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | dist
2 |
--------------------------------------------------------------------------------
/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "root": true,
3 | "plugins": [
4 | "flowtype"
5 | ],
6 | "extends": [
7 | "plugin:vue-libs/recommended",
8 | "plugin:flowtype/recommended"
9 | ]
10 | }
11 |
--------------------------------------------------------------------------------
/.flowconfig:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zglz/vue-component-inspector/afcad8da6cd8b7ff3e3c714428c718fedf104523/.flowconfig
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | .idea/*
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "semi": false,
3 | "singleQuote": true,
4 | "printWidth": 80
5 | }
6 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zglz/vue-component-inspector/afcad8da6cd8b7ff3e3c714428c718fedf104523/CHANGELOG.md
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zglz/vue-component-inspector/afcad8da6cd8b7ff3e3c714428c718fedf104523/LICENSE
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Vue-Component-Inspector
2 |
3 | > Vue-Component-Inspector 是一款 Vue 2.0 开发调试工具,它本身也是一个 Vue 组件。
4 |
5 | > 特点:易安装,兼容性强。
6 |
7 |
8 | 基于 [Element-UI](https://element.faas.ele.me/#/zh-CN/component/installation) 开发。
9 |
10 | 
11 |
12 |
13 | ## 安装方法 (Vue CLI )
14 |
15 | ```bash
16 | $ npm install vue-component-inspector -S
17 | ```
18 |
19 |
20 | ####在 main.js 中写入以下内容:
21 | ```js
22 | import VCI from 'vue-component-inspector'
23 |
24 | Vue.use(VCI)
25 | ```
26 |
27 | ####在 app.vue 中写入以下内容:
28 | ```js
29 |
30 |
31 |
32 | ```
33 |
34 |
35 | ## 配置参数
36 | ```js
37 | const options = {
38 | noInspect: [] // 不可审查组件name
39 | };
40 | Vue.use(VCI, options)
41 | ```
42 |
43 |
44 | ## 使用教程
45 |
46 | ### 新增功能
47 | 1.非响检测
48 |
49 | 视频演示:
50 | https://www.bilibili.com/video/BV1vi4y1L7kf/
51 |
52 | 
53 |
54 |
55 |
56 | ### 视频教程
57 | [视频地址](https://www.bilibili.com/video/BV19g4y1v7g6): https://www.bilibili.com/video/BV19g4y1v7g6
58 |
59 | 
60 |
61 |
62 | [视频地址](https://www.bilibili.com/video/BV19g4y1v7g6): https://www.bilibili.com/video/BV19g4y1v7g6
63 |
64 | #### 视图栏
65 | 
66 |
67 | 1.组件视图开关
68 |
69 | 2.刷新视图按钮
70 |
71 |
72 | #### 导航面板
73 | 
74 |
75 | 3.通过全局变量 $vm 访问当前选中的组件实例
76 |
77 | 4.跳转最近的可审查父组件
78 |
79 | 5.审查组件
80 |
81 |
82 |
83 | #### 基本信息面板
84 | 
85 |
86 | 7.组件名称
87 |
88 | 8.组件路径
89 |
90 |
91 |
92 | #### 数据面板
93 | 
94 |
95 |
96 | #### 事件面板
97 | 
98 |
99 | 8.DOM事件
100 |
101 | 9.组件事件
102 |
103 |
104 |
105 | #### ⚠️ 注意事项
106 |
107 |
108 | ##### 可审查组件
109 |
110 | 为了提高调试工具性能,并非所有的组件都具有可审查的权限。 ⚠️ **只有组件具有name属性,并且不在noInspect中配置的组件具有审查权限( 具有name属性&&(!noInspect) )**
111 |
112 | 使用 [Element-UI](https://element.faas.ele.me/#/zh-CN/component/installation) 作为基础 UI 的项目,建议配置如下:
113 | ```js
114 | const options = {
115 | noInspect:['ElPagination', 'ElDialog', 'ElAutocomplete', 'ElDropdown', 'ElDropdownMenu', 'ElDropdownItem', 'ElMenu', 'ElSubmenu', 'ElMenuItem', 'ElMenuItemGroup', 'ElInput', 'ElInputNumber', 'ElRadio', 'ElRadioGroup', 'ElRadioButton', 'ElCheckbox', 'ElCheckboxButton', 'ElCheckboxGroup', 'ElSwitch', 'ElSelect', 'ElOption', 'ElOptionGroup', 'ElButtonGroup', 'ElTable', 'ElTableColumn', 'ElDatePicker', 'ElTimeSelect', 'ElTimePicker', 'ElPopover', 'ElTooltip', 'ElBreadcrumb', 'ElBreadcrumbItem', 'ElForm', 'ElFormItem', 'ElTabs', 'ElTabPane', 'ElTag', 'ElTree', 'ElAlert', 'ElSlider', 'ElIcon', 'ElRow', 'ElCol', 'ElUpload', 'ElProgress', 'ElSpinner', 'ElBadge', 'ElCard', 'ElRate', 'ElSteps', 'ElStep', 'ElCarousel', 'ElScrollbar', 'ElCarouselItem', 'ElCollapse', 'ElCollapseItem', 'ElCascader', 'ElColorPicker', 'ElTransfer', 'ElContainer', 'ElHeader', 'ElAside', 'ElMain', 'ElFooter', 'ElTimeline', 'ElTimelineItem', 'ElLink', 'ElDivider', 'ElImage', 'ElCalendar', 'ElBacktop', 'ElPageHeader', 'ElCascaderPanel', 'ElAvatar', 'ElDrawer', 'ElPopconfirm', 'ElCollapseTransition', 'ElTreeNode', undefined, 'SvgIcon', 'SidebarItem','ElTableBody','ElTableHeader','ElSelectDropdown']
116 | };
117 | Vue.use(VCI, options)
118 | ```
119 |
120 | 如果使用其他 UI 库,请自行配置
121 |
122 |
123 | ## 本地开发
124 | ```bash
125 | $ npm i
126 | $ npm run dev:dist
127 | ```
128 |
129 |
130 | ## 感谢大家使用,如有问题联系我
131 |
132 | 
133 |
134 |
135 |
136 |
137 |
--------------------------------------------------------------------------------
/assets/base.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zglz/vue-component-inspector/afcad8da6cd8b7ff3e3c714428c718fedf104523/assets/base.jpg
--------------------------------------------------------------------------------
/assets/com.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zglz/vue-component-inspector/afcad8da6cd8b7ff3e3c714428c718fedf104523/assets/com.jpg
--------------------------------------------------------------------------------
/assets/data.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zglz/vue-component-inspector/afcad8da6cd8b7ff3e3c714428c718fedf104523/assets/data.jpg
--------------------------------------------------------------------------------
/assets/erweima.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zglz/vue-component-inspector/afcad8da6cd8b7ff3e3c714428c718fedf104523/assets/erweima.jpg
--------------------------------------------------------------------------------
/assets/event.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zglz/vue-component-inspector/afcad8da6cd8b7ff3e3c714428c718fedf104523/assets/event.jpg
--------------------------------------------------------------------------------
/assets/feixiangjiance.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zglz/vue-component-inspector/afcad8da6cd8b7ff3e3c714428c718fedf104523/assets/feixiangjiance.jpg
--------------------------------------------------------------------------------
/assets/fonts/element-icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zglz/vue-component-inspector/afcad8da6cd8b7ff3e3c714428c718fedf104523/assets/fonts/element-icons.woff
--------------------------------------------------------------------------------
/assets/nav.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zglz/vue-component-inspector/afcad8da6cd8b7ff3e3c714428c718fedf104523/assets/nav.jpg
--------------------------------------------------------------------------------
/assets/screenshot.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zglz/vue-component-inspector/afcad8da6cd8b7ff3e3c714428c718fedf104523/assets/screenshot.jpg
--------------------------------------------------------------------------------
/assets/show.mov:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zglz/vue-component-inspector/afcad8da6cd8b7ff3e3c714428c718fedf104523/assets/show.mov
--------------------------------------------------------------------------------
/assets/show.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zglz/vue-component-inspector/afcad8da6cd8b7ff3e3c714428c718fedf104523/assets/show.mp4
--------------------------------------------------------------------------------
/assets/video.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zglz/vue-component-inspector/afcad8da6cd8b7ff3e3c714428c718fedf104523/assets/video.jpg
--------------------------------------------------------------------------------
/assets/viewBar.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zglz/vue-component-inspector/afcad8da6cd8b7ff3e3c714428c718fedf104523/assets/viewBar.jpg
--------------------------------------------------------------------------------
/build/build.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs')
2 | const path = require('path')
3 | const zlib = require('zlib')
4 | const terser = require('terser')
5 | const rollup = require('rollup')
6 | const configs = require('./configs')
7 |
8 | if (!fs.existsSync('dist')) {
9 | fs.mkdirSync('dist')
10 | }
11 |
12 | build(configs)
13 |
14 | function build (builds) {
15 | let built = 0
16 | const total = builds.length
17 | const next = () => {
18 | buildEntry(builds[built])
19 | .then(() => {
20 | built++
21 | if (built < total) {
22 | next()
23 | }
24 | })
25 | .catch(logError)
26 | }
27 |
28 | next()
29 | }
30 |
31 | function buildEntry ({ input, output }) {
32 | const { file, banner } = output
33 | const isProd = /min\.js$/.test(file)
34 | return rollup
35 | .rollup(input)
36 | .then(bundle => bundle.generate(output))
37 | .then(bundle => {
38 | // console.log(bundle)
39 | const code = bundle.output[0].code
40 | if (isProd) {
41 | const minified =
42 | (banner ? banner + '\n' : '') +
43 | terser.minify(code, {
44 | toplevel: true,
45 | output: {
46 | ascii_only: true
47 | },
48 | compress: {
49 | pure_funcs: ['makeMap']
50 | }
51 | }).code
52 | return write(file, minified, true)
53 | } else {
54 | return write(file, code)
55 | }
56 | })
57 | }
58 |
59 | function write (dest, code, zip) {
60 | return new Promise((resolve, reject) => {
61 | function report (extra) {
62 | console.log(
63 | blue(path.relative(process.cwd(), dest)) +
64 | ' ' +
65 | getSize(code) +
66 | (extra || '')
67 | )
68 | resolve()
69 | }
70 |
71 | fs.writeFile(dest, code, err => {
72 | if (err) return reject(err)
73 | if (zip) {
74 | zlib.gzip(code, (err, zipped) => {
75 | if (err) return reject(err)
76 | report(' (gzipped: ' + getSize(zipped) + ')')
77 | })
78 | } else {
79 | report()
80 | }
81 | })
82 | })
83 | }
84 |
85 | function getSize (code) {
86 | return (code.length / 1024).toFixed(2) + 'kb'
87 | }
88 |
89 | function logError (e) {
90 | console.log(e)
91 | }
92 |
93 | function blue (str) {
94 | return '\x1b[1m\x1b[34m' + str + '\x1b[39m\x1b[22m'
95 | }
96 |
--------------------------------------------------------------------------------
/build/configs.js:
--------------------------------------------------------------------------------
1 | const path = require('path')
2 | const buble = require('rollup-plugin-buble')
3 | const flow = require('rollup-plugin-flow-no-whitespace')
4 | const cjs = require('rollup-plugin-commonjs')
5 | const node = require('rollup-plugin-node-resolve')
6 | const replace = require('rollup-plugin-replace')
7 | const uglify = require('rollup-plugin-uglify')
8 | const version = process.env.VERSION || require('../package.json').version
9 | const vue = require('rollup-plugin-vue');
10 | const terser = require("rollup-plugin-terser");
11 | const banner =
12 | `/*!
13 | * vue-component-inspector v${version}
14 | * (c) ${new Date().getFullYear()} zhanggaungliang
15 | * @license MIT
16 | */`
17 |
18 | const resolve = _path => path.resolve(__dirname, '../', _path)
19 |
20 | module.exports = [
21 | // browser dev
22 | {
23 | file: resolve('dist/vue-component-inspector.js'),
24 | format: 'umd',
25 | env: 'development'
26 | },
27 | {
28 | file: resolve('dist/vue-component-inspector.min.js'),
29 | format: 'umd',
30 | env: 'production'
31 | },
32 | {
33 | file: resolve('dist/vue-component-inspector.common.js'),
34 | format: 'cjs'
35 | },
36 | {
37 | file: resolve('dist/vue-component-inspector.esm.js'),
38 | format: 'es'
39 | },
40 | {
41 | file: resolve('dist/vue-component-inspector.esm.browser.js'),
42 | format: 'es',
43 | env: 'development',
44 | transpile: false
45 | },
46 | {
47 | file: resolve('dist/vue-component-inspector.esm.browser.min.js'),
48 | format: 'es',
49 | env: 'production',
50 | transpile: false
51 | }
52 | ].map(genConfig)
53 |
54 | function genConfig (opts) {
55 | const config = {
56 | input: {
57 | input: resolve('src/index.js'),
58 | plugins: [
59 | flow(),
60 | node(),
61 | cjs(),
62 | vue(),
63 | // babel(),
64 | replace({
65 | __VERSION__: version
66 | }),
67 | terser.terser()
68 |
69 | ]
70 | },
71 | output: {
72 | file: opts.file,
73 | format: opts.format,
74 | banner,
75 | name: 'vueComponentInspector',
76 | sourceMap: false
77 | },
78 |
79 | }
80 |
81 | if (opts.env) {
82 | config.input.plugins.unshift(replace({
83 | 'process.env.NODE_ENV': JSON.stringify(opts.env)
84 | }))
85 | }
86 |
87 | if (opts.transpile !== false) {
88 | // config.input.plugins.push(buble())
89 | }
90 |
91 | return config
92 | }
93 |
--------------------------------------------------------------------------------
/build/rollup.dev.config.js:
--------------------------------------------------------------------------------
1 | const { input, output } = require('./configs')[0]
2 |
3 | module.exports = Object.assign({}, input, { output })
4 |
--------------------------------------------------------------------------------
/dist/vue-component-inspector.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"vue-component-inspector.js","sources":["../node_modules/_vue-runtime-helpers@1.1.2@vue-runtime-helpers/dist/normalize-component.mjs","../node_modules/_vue-runtime-helpers@1.1.2@vue-runtime-helpers/dist/inject-style/browser.mjs","../src/components/treeLoading.vue","../src/components/navigation.vue","../src/components/basic.vue","../src/components/event.vue","../src/config.js","../src/util/util.js","../src/components/dataItem.vue","../src/components/data.vue","../src/components/index.vue","../src/page/contaienr-01.vue","../src/page/contaienr-02.vue","../src/page/contaienr-03.vue","../src/page/page.vue","../src/helper/label.js","../src/helper/imgs.js","../src/install.js","../src/util/dom.js","../src/index.js","../src/helper/event.js"],"sourcesContent":["function normalizeComponent(template, style, script, scopeId, isFunctionalTemplate, moduleIdentifier /* server only */, shadowMode, createInjector, createInjectorSSR, createInjectorShadow) {\r\n if (typeof shadowMode !== 'boolean') {\r\n createInjectorSSR = createInjector;\r\n createInjector = shadowMode;\r\n shadowMode = false;\r\n }\r\n // Vue.extend constructor export interop.\r\n const options = typeof script === 'function' ? script.options : script;\r\n // render functions\r\n if (template && template.render) {\r\n options.render = template.render;\r\n options.staticRenderFns = template.staticRenderFns;\r\n options._compiled = true;\r\n // functional template\r\n if (isFunctionalTemplate) {\r\n options.functional = true;\r\n }\r\n }\r\n // scopedId\r\n if (scopeId) {\r\n options._scopeId = scopeId;\r\n }\r\n let hook;\r\n if (moduleIdentifier) {\r\n // server build\r\n hook = function (context) {\r\n // 2.3 injection\r\n context =\r\n context || // cached call\r\n (this.$vnode && this.$vnode.ssrContext) || // stateful\r\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext); // functional\r\n // 2.2 with runInNewContext: true\r\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\r\n context = __VUE_SSR_CONTEXT__;\r\n }\r\n // inject component styles\r\n if (style) {\r\n style.call(this, createInjectorSSR(context));\r\n }\r\n // register component module identifier for async chunk inference\r\n if (context && context._registeredComponents) {\r\n context._registeredComponents.add(moduleIdentifier);\r\n }\r\n };\r\n // used by ssr in case component is cached and beforeCreate\r\n // never gets called\r\n options._ssrRegister = hook;\r\n }\r\n else if (style) {\r\n hook = shadowMode\r\n ? function (context) {\r\n style.call(this, createInjectorShadow(context, this.$root.$options.shadowRoot));\r\n }\r\n : function (context) {\r\n style.call(this, createInjector(context));\r\n };\r\n }\r\n if (hook) {\r\n if (options.functional) {\r\n // register for functional component in vue file\r\n const originalRender = options.render;\r\n options.render = function renderWithStyleInjection(h, context) {\r\n hook.call(context);\r\n return originalRender(h, context);\r\n };\r\n }\r\n else {\r\n // inject component registration as beforeCreate hook\r\n const existing = options.beforeCreate;\r\n options.beforeCreate = existing ? [].concat(existing, hook) : [hook];\r\n }\r\n }\r\n return script;\r\n}\n\nexport default normalizeComponent;\n//# sourceMappingURL=normalize-component.mjs.map\n","const isOldIE = typeof navigator !== 'undefined' &&\r\n /msie [6-9]\\\\b/.test(navigator.userAgent.toLowerCase());\r\nfunction createInjector(context) {\r\n return (id, style) => addStyle(id, style);\r\n}\r\nlet HEAD;\r\nconst styles = {};\r\nfunction addStyle(id, css) {\r\n const group = isOldIE ? css.media || 'default' : id;\r\n const style = styles[group] || (styles[group] = { ids: new Set(), styles: [] });\r\n if (!style.ids.has(id)) {\r\n style.ids.add(id);\r\n let code = css.source;\r\n if (css.map) {\r\n // https://developer.chrome.com/devtools/docs/javascript-debugging\r\n // this makes source maps inside style tags work properly in Chrome\r\n code += '\\n/*# sourceURL=' + css.map.sources[0] + ' */';\r\n // http://stackoverflow.com/a/26603875\r\n code +=\r\n '\\n/*# sourceMappingURL=data:application/json;base64,' +\r\n btoa(unescape(encodeURIComponent(JSON.stringify(css.map)))) +\r\n ' */';\r\n }\r\n if (!style.element) {\r\n style.element = document.createElement('style');\r\n style.element.type = 'text/css';\r\n if (css.media)\r\n style.element.setAttribute('media', css.media);\r\n if (HEAD === undefined) {\r\n HEAD = document.head || document.getElementsByTagName('head')[0];\r\n }\r\n HEAD.appendChild(style.element);\r\n }\r\n if ('styleSheet' in style.element) {\r\n style.styles.push(code);\r\n style.element.styleSheet.cssText = style.styles\r\n .filter(Boolean)\r\n .join('\\n');\r\n }\r\n else {\r\n const index = style.ids.size - 1;\r\n const textNode = document.createTextNode(code);\r\n const nodes = style.element.childNodes;\r\n if (nodes[index])\r\n style.element.removeChild(nodes[index]);\r\n if (nodes.length)\r\n style.element.insertBefore(textNode, nodes[index]);\r\n else\r\n style.element.appendChild(textNode);\r\n }\r\n }\r\n}\n\nexport default createInjector;\n//# sourceMappingURL=browser.mjs.map\n","\r\n \r\n\r\n\r\n\r\n\r\n\r\n\r\n","\r\n \r\n
\r\n\r\n
0\" v-model=\"filterText\" placeholder=\"Enter keywords to filter\" size=\"mini\"/>\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n\r\n
\r\n mouseover(data)\" @mouseout=\"() => mouseout(data)\">\r\n \r\n <{{ node.label }}> - $vm\r\n check(data)\" style=\"border-radius: 10px;\"/>\r\n toParent()\"/>\r\n \r\n \r\n
\r\n \r\n
\r\n\r\n\r\n\r\n\r\n\r\n\r\n","\r\n \r\n
组件类型:普通组件
\r\n
组件路径:{{ url }}
\r\n\r\n\r\n
\r\n\r\n\r\n\r\n\r\n\r\n\r\n","\r\n \r\n \r\n \r\n
DOM-Event
\r\n
\r\n
0\">\r\n
\r\n \r\n \r\n \r\n {{ eventItem.type }}\r\n - {{ eventItem.name }}\r\n
\r\n \r\n\r\n
\r\n \r\n
\r\n \r\n
Component-Event
\r\n
\r\n
0\" style=\"padding-left: 20px;\">\r\n \r\n {{ event.type }}\r\n - {{ event.name?event.name:'anonymous' }}\r\n
\r\n\r\n \r\n
\r\n\r\n
\r\n\r\n\r\n\r\n\r\n\r\n\r\n","export const NoInspect = []\r\n\r\nexport const VueBuiltIn = ['KeepAlive', 'transition', 'TransitionGroup', 'Basic', 'Navigation', 'Data','Event']\r\n","import { NoInspect, VueBuiltIn } from './../config'\r\n\r\nexport function isViewCom (vm) {\r\n // debugger\r\n const vmNname = vm.$options.name\r\n let ret = true\r\n if (!vmNname) { // not Name\r\n ret = false\r\n }\r\n if (NoInspect.indexOf(vmNname) > 0) { // NoInspect\r\n ret = false\r\n }\r\n if (VueBuiltIn.indexOf(vmNname) > 0) { // VueBuiltIn com\r\n ret = false\r\n }\r\n if (vmNname === 'VueComponentInspector') {\r\n ret = false\r\n }\r\n return ret\r\n}\r\n\r\nexport function isPlainObject (obj) {\r\n return Object.prototype.toString.call(obj) === '[object Object]'\r\n}\r\n","\r\n \r\n \r\n {{ item.key }} :\r\n \r\n \r\n {{ item.type }} ({{ item.children?item.children.length:0 }})\r\n \r\n \r\n \r\n \r\n {{ item.value }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n {{ item.value }}\r\n \r\n \r\n \r\n \r\n \r\n {{ item.value }}\r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n\r\n","\r\n \r\n
\r\n \r\n
0\" class=\"no-reactive-data\">\r\n \r\n {{ item }} ,\r\n \r\n
\r\n\r\n \r\n \r\n \r\n\r\n \r\n
{expandTree(node, data,treeIdArr)}\"\r\n @node-collapse=\"(node, data)=>{collapseTree(node, data,treeIdArr)}\">\r\n \r\n \r\n $Data\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n\r\n \r\n
{expandTree(node, data,propsTreeIdArr)}\"\r\n @node-collapse=\"(node, data)=>{collapseTree(node, data,propsTreeIdArr)}\">>\r\n \r\n $Props\r\n \r\n \r\n \r\n\r\n
\r\n\r\n\r\n\r\n\r\n\r\n\r\n","\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n
<{{ curVm&&curVm.$options.name }}>
\r\n {{path}}\r\n \r\n select a component to inspect
\r\n \r\n\r\n \r\n \r\n Data\r\n \r\n \r\n \r\n \r\n \r\n Event\r\n \r\n \r\n \r\n \r\n \r\n DIY\r\n \r\n \r\n Here's your idea\r\n
\r\n \r\n \r\n \r\n\r\n
\r\n
\r\n
{{ dataSource }}
\r\n
\r\n\r\n\r\n
\r\n\r\n\r\n\r\n\r\n\r\n\r\n","\r\n \r\n\r\n\r\n\r\n\r\n\r\n\r\n","\r\n \r\n 组件A\r\n
\r\n\r\n\r\n\r\n\r\n\r\n\r\n","\r\n \r\n\r\n\r\n\r\n\r\n\r\n\r\n","\r\n \r\n \r\n \r\n \r\n\r\n
\r\n\r\n\r\n\r\n\r\n\r\n","import { comLabelLogo } from './imgs'\r\n// previous vue\r\nlet preVm = null\r\n// clear DomEventLabel-fn\r\nlet clearDomEventLabel = null\r\nconst EventLabelCollection = []\r\nconst componentsLabelProps = {\r\n attr: {\r\n className: 'vue-component-inspector'\r\n },\r\n style: {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n margin: '4px',\r\n background: '#a6dfa6',\r\n cursor: 'pointer',\r\n fontSize: '8px',\r\n zIndex: 10\r\n }\r\n\r\n}\r\nconst componentsLabelImgProps = {\r\n attr: {\r\n src: comLabelLogo\r\n },\r\n style: {\r\n width: '20px',\r\n float: 'left'\r\n }\r\n\r\n}\r\nconst eventIconProps = {\r\n attr: {\r\n className: 'el-icon-caret-left event-icon'\r\n },\r\n style: {\r\n fontSize: '31px',\r\n position: 'absolute',\r\n left: '-22px',\r\n top: '-7px',\r\n color: '#a6dfa2'\r\n }\r\n\r\n}\r\nconst domEventLabelProps = {\r\n attr: {\r\n innerText: 'e',\r\n className: 'event-label'\r\n },\r\n style: {\r\n background: 'rgb(255, 255, 255)',\r\n color: 'rgb(166, 223, 162)',\r\n border: '3px solid rgb(166, 223, 162)',\r\n display: 'inline-block',\r\n borderRadius: '5px',\r\n padding: '3px 5px',\r\n position: 'absolute',\r\n top: '-1px',\r\n left: '186px',\r\n cursor: 'pointer',\r\n fontSize: '17px',\r\n lineHeight: '10px',\r\n marginLeft: '5px',\r\n zIndex: '10'\r\n }\r\n\r\n}\r\n// setElementProps\r\nfunction setElementProps (el, props) {\r\n for (const key in props) {\r\n if (key === 'attr') {\r\n for (const attrKey in props[key]) {\r\n el[attrKey] = props[key][attrKey]\r\n }\r\n }\r\n if (key === 'style') {\r\n for (const styleKey in props[key]) {\r\n el.style[styleKey] = props[key][styleKey]\r\n }\r\n }\r\n }\r\n}\r\n// createDomEventLabel\r\nfunction createDomEventLabel (vm) {\r\n function setPosition (nodeEventMap) {\r\n nodeEventMap.map((map, i) => {\r\n const offsetTop = map.eventNode.offsetTop\r\n const offsetLeft = map.eventNode.offsetLeft\r\n const top = offsetTop\r\n const left = map.eventNode.offsetWidth + offsetLeft\r\n setElementProps(map.eventLabel, { style: { top: (top + 'px'), left: (left + 'px') }})\r\n })\r\n }\r\n if (vm.$options.eventList) {\r\n const domEvent = vm.$options.eventList.dom\r\n const nodeEventMap = []\r\n // add label\r\n domEvent.map((e, i) => {\r\n const eventNode = e.el\r\n\r\n const eventIcon = document.createElement('i')\r\n setElementProps(eventIcon, eventIconProps)\r\n const span = document.createElement('span')\r\n setElementProps(span, domEventLabelProps)\r\n span.appendChild(eventIcon)\r\n\r\n e.eventLabel = span\r\n nodeEventMap.push({\r\n eventNode: eventNode,\r\n eventLabel: span\r\n })\r\n EventLabelCollection.push(span)\r\n // eventlabel add event\r\n span.addEventListener('click', () => {\r\n preVm.$options.eventList.dom.map((dom) => {\r\n if (dom.eventLabel === span) {\r\n setElementProps(span, { style: { color: '#409EFF', borderColor: '#409EFF' }})\r\n setElementProps(eventIcon, { style: { color: '#409EFF' }})\r\n dom.isShow = true\r\n } else {\r\n // debugger\r\n setElementProps(dom.eventLabel, { style: { color: '#a6dfa5', borderColor: '#a6dfa5' }})\r\n setElementProps(dom.eventLabel.getElementsByTagName('i')[0], { style: { color: '#a6dfa5' }})\r\n dom.isShow = false\r\n }\r\n })\r\n // updata view\r\n document.getElementById('event').__vue__.$forceUpdate()\r\n })\r\n })\r\n // add eventLabel\r\n nodeEventMap.map((map, i) => {\r\n map.eventNode.parentNode.appendChild(map.eventLabel)\r\n })\r\n // position\r\n setPosition(nodeEventMap)\r\n window.removeEventListener('resize', setPosition(nodeEventMap))\r\n window.addEventListener('resize', setPosition(nodeEventMap))\r\n return EventLabelCollection\r\n } else {\r\n return []\r\n }\r\n}\r\n// createComponentsLabel\r\nexport function createComponentsLabel (el, vm, vmNname) {\r\n const div = document.createElement('div')\r\n div.title = `<${vmNname}/>`\r\n setElementProps(div, componentsLabelProps)\r\n // createImg\r\n const img = document.createElement('img')\r\n setElementProps(img, componentsLabelImgProps)\r\n div.appendChild(img)\r\n // setEvent\r\n div.addEventListener('click', (e) => {\r\n e.stopPropagation()\r\n e.preventDefault()\r\n // clear previous style\r\n if (preVm) {\r\n let el = preVm.$el\r\n if (preVm.$options.comment) { // comment\r\n el = el.parentNode\r\n }\r\n setElementProps(el, { style: { outline: '1px solid green' }})\r\n }\r\n // set previous vm\r\n preVm = vm\r\n // set curVm\r\n vm.$root.VCIIndex.change(vm)\r\n // set cur style\r\n setElementProps(el, { style: { outline: '3px solid red', outlineOffset: '-3px' }})\r\n // clearDomEventLabel\r\n clearDomEventLabel && clearDomEventLabel()\r\n // create event label\r\n const domEventLabel = createDomEventLabel(vm)\r\n // set clearDomEventLabel-fn\r\n vm.$root.clearDomEventLabel = clearDomEventLabel = function () {\r\n domEventLabel.map((v) => {\r\n v.remove()\r\n })\r\n }\r\n // set global $vm\r\n window.$vm = vm\r\n })\r\n // Append the created child element to the component parent element\r\n // el.parentNode.appendChild(div);\r\n // Append the created child element to the component element\r\n // el.appendChild(div);\r\n // positiong ComponentsLabel\r\n function setCreateComponentsLabelPosition (map) {\r\n map.map((map, i) => {\r\n const offsetTop = map.vmEl.offsetTop\r\n const offsetLeft = map.vmEl.offsetLeft\r\n const top = offsetTop\r\n // let left = map.vmEl.offsetWidth/2 + offsetLeft\r\n const left = offsetLeft\r\n setElementProps(map.componentsLabel, { style: { top: (top + 'px'), left: (left + 'px') }})\r\n })\r\n }\r\n window.setTimeout(() => {\r\n setCreateComponentsLabelPosition([{\r\n vmEl: el,\r\n componentsLabel: div\r\n }])\r\n }, 2000)\r\n window.addEventListener('resize', () => {\r\n setCreateComponentsLabelPosition([{\r\n vmEl: el,\r\n componentsLabel: div\r\n }])\r\n })\r\n return div\r\n}\r\n\r\n","// logo\r\nexport const comLabelLogo = 'data:image/jpg;base64,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'\r\n","import index from './components/index.vue'\r\nimport page from './page/page.vue'\r\nimport { isViewCom } from './util/util'\r\nimport { NoInspect } from './config'\r\nimport { addEventList } from './helper/event'\r\nimport { createComponentsLabel } from './helper/label'\r\nexport let _Vue\r\nexport function install (Vue,options={}) {\r\n if (install.installed && _Vue === Vue) return\r\n install.installed = true\r\n _Vue = Vue\r\n // debugger\r\n let noInspect = options.noInspect||[]\r\n noInspect.map((v)=>{\r\n NoInspect.push(v)\r\n })\r\n\r\n\r\n const componentsLabelCollection = []\r\n // minxin mounted , destroyed\r\n Vue.mixin({\r\n mounted () {\r\n let el = this.$el\r\n const vmNname = this.$options.name\r\n if (this && this.$root === this) {\r\n // rootVm\r\n\r\n // set componentsLabelCollection\r\n this.$root.componentsLabelCollection = componentsLabelCollection\r\n this.$root.$options.fileUrl = 'root'\r\n // set curVm\r\n this.curVm = null\r\n }\r\n if (isViewCom(this)) {\r\n // remark selet element\r\n if (el.nodeType === 8) {\r\n el = el.parentNode\r\n this.$options.comment = true\r\n }\r\n /* const computedStyle = document.defaultView.getComputedStyle(el, null)\r\n const position = computedStyle.position\r\n if (position !== 'absolute' && position !== 'relative' && position !== 'fixed') {\r\n el.style.position = 'relative'\r\n }*/\r\n // Process Event\r\n window.setTimeout(() => {\r\n addEventList(this)\r\n })\r\n // add component label\r\n const componentsLabel = createComponentsLabel(el, this, vmNname)\r\n this.componentsLabel = componentsLabel\r\n componentsLabelCollection.push({ vmEl: el, componentsLabel: componentsLabel })\r\n }\r\n },\r\n destroyed () {\r\n this.componentsLabel && this.componentsLabel.remove()\r\n }\r\n })\r\n Vue.component('Page', page)\r\n Vue.component('VueComponentInspector', index)\r\n}\r\n","/* @flow */\r\n\r\nexport const inBrowser = typeof window !== 'undefined'\r\n","import { install } from './install'\r\nimport { inBrowser } from './util/dom'\r\nconst VCI = {\r\n install: install,\r\n version: '__VERSION__'\r\n}\r\nexport default VCI\r\nif (inBrowser && window.Vue) {\r\n window.Vue.use(VCI,{\r\n noInspect:['ElPagination', 'ElDialog', 'ElAutocomplete', 'ElDropdown', 'ElDropdownMenu', 'ElDropdownItem', 'ElMenu', 'ElSubmenu', 'ElMenuItem', 'ElMenuItemGroup', 'ElInput', 'ElInputNumber', 'ElRadio', 'ElRadioGroup', 'ElRadioButton', 'ElCheckbox', 'ElCheckboxButton', 'ElCheckboxGroup', 'ElSwitch', 'ElSelect', 'ElOption', 'ElOptionGroup', 'ElButtonGroup', 'ElTable', 'ElTableColumn', 'ElDatePicker', 'ElTimeSelect', 'ElTimePicker', 'ElPopover', 'ElTooltip', 'ElBreadcrumb', 'ElBreadcrumbItem', 'ElForm', 'ElFormItem', 'ElTabs', 'ElTabPane', 'ElTag', 'ElTree', 'ElAlert', 'ElSlider', 'ElIcon', 'ElRow', 'ElCol', 'ElUpload', 'ElProgress', 'ElSpinner', 'ElBadge', 'ElCard', 'ElRate', 'ElSteps', 'ElStep', 'ElCarousel', 'ElScrollbar', 'ElCarouselItem', 'ElCollapse', 'ElCollapseItem', 'ElCascader', 'ElColorPicker', 'ElTransfer', 'ElContainer', 'ElHeader', 'ElAside', 'ElMain', 'ElFooter', 'ElTimeline', 'ElTimelineItem', 'ElLink', 'ElDivider', 'ElImage', 'ElCalendar', 'ElBacktop', 'ElPageHeader', 'ElCascaderPanel', 'ElAvatar', 'ElDrawer', 'ElPopconfirm', 'ElCollapseTransition', 'ElTreeNode', undefined, 'SvgIcon', 'SidebarItem','ElTableBody','ElTableHeader','ElSelectDropdown']\r\n })\r\n}\r\n","export function addEventList (vm) {\r\n const eventList = { dom: [], com: [] }\r\n\r\n /** *************** addDOMEvent **********************/\r\n // 获取具有DOM事件的Vnode\r\n const VnodeListWithEvent = []\r\n function parseVnodehEvent (vnode, VnodeListWithEvent) {\r\n if (vnode.data && vnode.data.on && (!vnode.componentInstance)) {\r\n VnodeListWithEvent.push(vnode)\r\n }\r\n if (vnode.children) {\r\n vnode.children.map((vm, i) => {\r\n parseVnodehEvent(vm, VnodeListWithEvent)\r\n })\r\n }\r\n }\r\n parseVnodehEvent(vm._vnode, VnodeListWithEvent)\r\n\r\n VnodeListWithEvent.map((Vnode, i) => {\r\n const VnodeEvent = Vnode.data.on\r\n if (VnodeEvent) {\r\n const event = []\r\n for (const key in VnodeEvent) {\r\n // get eventFnName\r\n const eventFullFnName = VnodeEvent[key].fns.name\r\n let eventFnName = ''\r\n if (eventFullFnName === key) {\r\n //\r\n if (vm.$options.methods) {\r\n Object.keys(vm.$options.methods).map((m) => {\r\n if (VnodeEvent[key].fns.toString().indexOf(m) > -1) {\r\n eventFnName = m\r\n }\r\n })\r\n }\r\n } else {\r\n eventFnName = eventFullFnName.split(' ')[1]\r\n }\r\n // VnodeEvent[key].fns\r\n // if(!eventFnName){\r\n // debugger\r\n // }\r\n\r\n event.push({\r\n name: eventFnName||'inline-event',\r\n type: 'on' + key,\r\n fn: eventFnName ? vm[eventFnName] : VnodeEvent[key].fns\r\n })\r\n }\r\n\r\n eventList.dom.push({\r\n name: 'ele' + i,\r\n el: Vnode.elm,\r\n event: event,\r\n isShow: false\r\n })\r\n\r\n // debugger\r\n }\r\n })\r\n\r\n vm.$options.eventList = eventList\r\n\r\n /** *************** addCOMEvent **********************/\r\n\r\n // if(vm.$options.name === \"Container01\"){\r\n // debugger\r\n\r\n const ComEvent = vm.$options._parentListeners\r\n\r\n for (const key in ComEvent) {\r\n // get eventFnName\r\n const eventFullFnName = ComEvent[key].fns.name\r\n let eventFnName = ''\r\n if (eventFullFnName === key) {\r\n //\r\n let $parent = vm.$parent\r\n while (!eventFnName) {\r\n if ($parent.$options.methods) {\r\n Object.keys($parent.$options.methods).map((m) => {\r\n if (ComEvent[key].fns.toString().indexOf(m) > -1) {\r\n eventFnName = m\r\n }\r\n })\r\n }\r\n if (!$parent.$parent) {\r\n break\r\n }\r\n $parent = $parent.$parent\r\n }\r\n } else {\r\n eventFnName = eventFullFnName.split(' ')[1]\r\n }\r\n\r\n eventList.com.push({\r\n name: eventFnName,\r\n type: key,\r\n el: vm.el,\r\n fn: eventFnName ? vm[eventFnName] : ComEvent[key].fns\r\n })\r\n }\r\n\r\n // }\r\n\r\n //\r\n}"],"names":["normalizeComponent","template","style","script","scopeId","isFunctionalTemplate","moduleIdentifier","shadowMode","createInjector","createInjectorSSR","createInjectorShadow","options","hook","render","staticRenderFns","_compiled","functional","_scopeId","context","this","$vnode","ssrContext","parent","__VUE_SSR_CONTEXT__","call","_registeredComponents","add","_ssrRegister","$root","$options","shadowRoot","originalRender","h","existing","beforeCreate","concat","isOldIE","navigator","test","userAgent","toLowerCase","id","css","group","media","styles","ids","Set","has","code","source","map","sources","btoa","unescape","encodeURIComponent","JSON","stringify","element","document","createElement","type","setAttribute","undefined","HEAD","head","getElementsByTagName","appendChild","push","styleSheet","cssText","filter","Boolean","join","index","size","textNode","createTextNode","nodes","childNodes","removeChild","length","insertBefore","addStyle","NoInspect","VueBuiltIn","isPlainObject","obj","Object","prototype","toString","preVm","clearDomEventLabel","EventLabelCollection","componentsLabelProps","attr","className","position","top","left","margin","background","cursor","fontSize","zIndex","componentsLabelImgProps","src","width","float","eventIconProps","color","domEventLabelProps","innerText","border","display","borderRadius","padding","lineHeight","marginLeft","setElementProps","el","props","key","attrKey","styleKey","createComponentsLabel","vm","vmNname","div","title","img","setCreateComponentsLabelPosition","i","vmEl","offsetTop","offsetLeft","componentsLabel","addEventListener","e","stopPropagation","preventDefault","$el","comment","parentNode","outline","VCIIndex","change","outlineOffset","domEventLabel","setPosition","nodeEventMap","eventNode","offsetWidth","eventLabel","eventList","domEvent","dom","eventIcon","span","borderColor","isShow","getElementById","__vue__","$forceUpdate","window","removeEventListener","createDomEventLabel","v","remove","$vm","setTimeout","_Vue","VCI","install","Vue","installed","noInspect","componentsLabelCollection","mixin","[object Object]","name","fileUrl","curVm","ret","indexOf","isViewCom","nodeType","com","VnodeListWithEvent","parseVnodehEvent","vnode","data","on","componentInstance","children","_vnode","Vnode","VnodeEvent","event","eventFullFnName","fns","eventFnName","methods","keys","m","split","fn","elm","ComEvent","_parentListeners","$parent","addEventList","component","page","version","use"],"mappings":"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"}
--------------------------------------------------------------------------------
/dist/vue-component-inspector.js.rej:
--------------------------------------------------------------------------------
1 | diff a/dist/vue-component-inspector.js b/dist/vue-component-inspector.js (rejected hunks)
2 | @@ -2093 +2095 @@
3 | - contaienr01: __vue_component__$6,contaienr02: __vue_component__$7,contaienr03: __vue_component__$8
4 | + contaienr01: __vue_component__$6, contaienr02: __vue_component__$7, contaienr03: __vue_component__$8
5 | @@ -2103,2 +2105,2 @@
6 | - defaultValue: function(val) {
7 | - }
8 | + defaultValue: function (val) {
9 | + }
10 | @@ -2109,3 +2111,3 @@
11 | - componentsView(view){
12 | - },
13 | - getData01(){
14 | + componentsView (view) {
15 | + },
16 | + getData01 () {
17 | @@ -2113,2 +2115,2 @@
18 | - },
19 | - getData02(){
20 | + },
21 | + getData02 () {
22 | @@ -2165,2 +2167,2 @@
23 | - inject("data-v-03bf61da_0", { source: "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", map: {"version":3,"sources":[],"names":[],"mappings":"","file":"page.vue"}, media: undefined })
24 | - ,inject("data-v-03bf61da_1", { source: "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", map: {"version":3,"sources":[],"names":[],"mappings":"","file":"page.vue"}, media: undefined });
25 | + inject("data-v-ac9f5db6_0", { source: "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", map: {"version":3,"sources":[],"names":[],"mappings":"","file":"page.vue"}, media: undefined })
26 | + ,inject("data-v-ac9f5db6_1", { source: "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", map: {"version":3,"sources":[],"names":[],"mappings":"","file":"page.vue"}, media: undefined });
27 | @@ -2170 +2172 @@
28 | - const __vue_scope_id__$9 = "data-v-03bf61da";
29 | + const __vue_scope_id__$9 = "data-v-ac9f5db6";
30 |
--------------------------------------------------------------------------------
/examples/basic/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Title
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
19 |
20 |
27 |
--------------------------------------------------------------------------------
/netlify.toml:
--------------------------------------------------------------------------------
1 | [build]
2 | ignore = "git diff --quiet HEAD^ HEAD ./docs/"
3 | publish = "docs/.vuepress/dist"
4 | command = "yarn run docs:build"
5 |
6 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vue-component-inspector",
3 | "version": "1.1.17",
4 | "description": "development tool for Vue.js 2",
5 | "author": "zhangguangliang-2020-06-20",
6 | "license": "MIT",
7 | "main": "dist/vue-component-inspector.common.js",
8 | "module": "dist/vue-component-inspector.esm.js",
9 | "unpkg": "dist/vue-component-inspector.js",
10 | "jsdelivr": "dist/vue-component-inspector.js",
11 | "sideEffects": false,
12 | "repository": {
13 | "type": "git",
14 | "url": ""
15 | },
16 | "typings": "",
17 | "files": [
18 | "src",
19 | "dist/*.js",
20 | "types/*.d.ts"
21 | ],
22 | "keywords": [
23 | "vue",
24 | "dev",
25 | "development",
26 | "tools"
27 | ],
28 | "scripts": {
29 | "dev": "node examples/server.js",
30 | "dev:dist": "rollup -wm -c build/rollup.dev.config.js",
31 | "build": "node build/build.js",
32 | "lint": "eslint --fix --ext .js,.vue src"
33 | },
34 | "gitHooks": {},
35 | "lint-staged": {
36 | "*.{js,vue}": [
37 | "eslint --fix",
38 | "git add"
39 | ]
40 | },
41 | "devDependencies": {
42 | "@babel/preset-env": "^7.12.1",
43 | "axios": "^0.19.0",
44 | "babel-core": "^6.24.1",
45 | "babel-eslint": "^10.0.2",
46 | "babel-loader": "^7.1.3",
47 | "babel-plugin-syntax-dynamic-import": "^6.18.0",
48 | "babel-preset-env": "^1.6.1",
49 | "babel-preset-es2015-rollup": "^3.0.0",
50 | "babel-preset-flow-vue": "^1.0.0",
51 | "browserstack-local": "^1.4.0",
52 | "buble": "^0.19.8",
53 | "chromedriver": "^81.0.0",
54 | "conventional-changelog-cli": "^2.0.11",
55 | "cross-spawn": "^6.0.5",
56 | "css-loader": "^2.1.1",
57 | "dotenv": "^8.0.0",
58 | "es6-promise": "^4.2.8",
59 | "eslint": "^4.19.1",
60 | "eslint-plugin-flowtype": "^2.46.1",
61 | "eslint-plugin-jasmine": "^2.10.1",
62 | "eslint-plugin-vue-libs": "^2.1.0",
63 | "express": "^4.17.1",
64 | "express-urlrewrite": "^1.2.0",
65 | "flow-bin": "^0.66.0",
66 | "geckodriver": "^1.16.2",
67 | "jasmine": "2.8.0",
68 | "lint-staged": "^8.2.0",
69 | "nightwatch": "^1.3.5",
70 | "nightwatch-helpers": "^1.0.0",
71 | "path-to-regexp": "^1.8.0",
72 | "rollup": "^1.20.1",
73 | "rollup-plugin-babel": "^4.4.0",
74 | "rollup-plugin-buble": "^0.19.8",
75 | "rollup-plugin-commonjs": "^10.0.2",
76 | "rollup-plugin-flow-no-whitespace": "^1.0.0",
77 | "rollup-plugin-node-resolve": "^5.2.0",
78 | "rollup-plugin-replace": "^2.0.0",
79 | "rollup-plugin-uglify": "^6.0.4",
80 | "rollup-watch": "^4.0.0",
81 | "selenium-server": "^3.141.59",
82 | "terser": "^4.2.0",
83 | "typescript": "^3.5.2",
84 | "vue": "^2.5.16",
85 | "vue-loader": "^15.2.1",
86 | "vue-template-compiler": "^2.6.11",
87 | "vuepress": "^0.14.11",
88 | "vuepress-theme-vue": "^1.1.0",
89 | "webpack": "^4.35.2",
90 | "webpack-dev-middleware": "^3.7.0",
91 | "yorkie": "^2.0.0"
92 | },
93 | "bugs": {
94 | "url": ""
95 | },
96 | "homepage": "",
97 | "dependencies": {
98 | "element-ui": "^2.13.2",
99 | "eslint-plugin-vue": "^4.7.1",
100 | "rollup-plugin-vue": "^5.1.9"
101 | }
102 | }
103 |
--------------------------------------------------------------------------------
/scripts/release.sh:
--------------------------------------------------------------------------------
1 | set -e
2 | echo "Enter release version: "
3 | read VERSION
4 |
5 | read -p "Releasing v$VERSION - are you sure? (y/n)" -n 1 -r
6 | echo # (optional) move to a new line
7 | if [[ $REPLY =~ ^[Yy]$ ]]
8 | then
9 | echo "Releasing v$VERSION ..."
10 | npm test
11 |
12 | # commit
13 | VERSION=$VERSION npm run build
14 | git add dist
15 | git commit -m "build: bundle $VERSION"
16 | npm version $VERSION --message "chore(release): %s"
17 |
18 | # changelog
19 | npm run changelog
20 | echo "Please check the git history and the changelog and press enter"
21 | read OKAY
22 | git add CHANGELOG.md
23 | git commit -m "chore(changelog): $VERSION"
24 |
25 | # publish
26 | git push origin refs/tags/v$VERSION
27 | git push
28 | npm publish
29 | fi
30 |
--------------------------------------------------------------------------------
/scripts/verifyCommitMsg.js:
--------------------------------------------------------------------------------
1 | const chalk = require('chalk') // eslint-disable-line
2 | const msgPath = process.env.GIT_PARAMS
3 | const msg = require('fs').readFileSync(msgPath, 'utf-8').trim()
4 |
5 | const commitRE = /^(v\d+\.\d+\.\d+(-(alpha|beta|rc.\d+))?$)|((revert: )?(feat|fix|docs|style|refactor|perf|test|workflow|ci|chore|types|build)(\(.+\))?: .{1,50})/
6 |
7 | if (!commitRE.test(msg)) {
8 | console.log()
9 | console.error(
10 | ` ${chalk.bgRed.white(' ERROR ')} ${chalk.red(`invalid commit message format.`)}\n\n` +
11 | chalk.red(` Proper commit message format is required for automated changelog generation. Examples:\n\n`) +
12 | ` ${chalk.green(`feat(compiler): add 'comments' option`)}\n` +
13 | ` ${chalk.green(`fix(v-model): handle events on blur (close #28)`)}\n\n` +
14 | chalk.red(` See .github/COMMIT_CONVENTION.md for more details.\n`) +
15 | chalk.red(` You can also use ${chalk.cyan(`npm run commit`)} to interactively generate a commit message.\n`)
16 | )
17 | process.exit(1)
18 | }
19 |
--------------------------------------------------------------------------------
/src/components/basic.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
组件类型:普通组件
4 |
组件路径:{{ url }}
5 |
6 |
7 |
8 |
9 |
61 |
62 |
67 |
69 |
70 |
--------------------------------------------------------------------------------
/src/components/data.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | {{ item }} ,
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
{expandTree(node, data,treeIdArr)}"
27 | @node-collapse="(node, data)=>{collapseTree(node, data,treeIdArr)}">
28 |
29 |
30 | $Data
31 |
32 |
33 |
34 |
35 |
36 |
39 |
40 |
41 |
42 |
{expandTree(node, data,propsTreeIdArr)}"
52 | @node-collapse="(node, data)=>{collapseTree(node, data,propsTreeIdArr)}">>
53 |
54 | $Props
55 |
56 |
57 |
58 |
59 |
60 |
61 |
241 |
242 |
282 |
284 |
285 |
--------------------------------------------------------------------------------
/src/components/dataItem.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{ item.key }} :
5 |
6 |
7 | {{ item.type }} ({{ item.children?item.children.length:0 }})
8 |
9 |
10 |
11 |
12 | {{ item.value }}
13 |
14 |
15 |
16 |
17 |
18 |
19 | {{ item.value }}
20 |
21 |
22 |
23 |
24 |
25 | {{ item.value }}
26 |
27 |
28 |
29 |
64 |
65 |
70 |
72 |
73 |
--------------------------------------------------------------------------------
/src/components/event.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
DOM-Event
6 |
7 |
8 |
9 |
10 |
11 |
12 | {{ eventItem.type }}
13 | - {{ eventItem.name }}
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
Component-Event
22 |
23 |
24 |
25 | {{ event.type }}
26 | - {{ event.name?event.name:'anonymous' }}
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
81 |
82 |
116 |
118 |
119 |
--------------------------------------------------------------------------------
/src/components/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
14 |
15 |
16 |
17 |
18 |
<{{ curVm&&curVm.$options.name }}>
19 | {{path}}
20 |
21 |
select a component to inspect
22 |
23 |
26 |
27 |
28 | Data
29 |
30 |
31 |
32 |
33 |
34 | Event
35 |
36 |
37 |
38 |
39 |
40 | DIY
41 |
42 |
43 | Here's your idea
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
{{ dataSource }}
52 |
53 |
54 |
55 |
56 |
57 |
157 |
158 |
245 |
288 |
289 |
--------------------------------------------------------------------------------
/src/components/navigation.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
24 | mouseover(data)" @mouseout="() => mouseout(data)">
25 |
26 | <{{ node.label }}> - $vm
27 | check(data)" style="border-radius: 10px;"/>
28 | toParent()"/>
29 |
30 |
31 |
32 |
33 |
34 |
35 |
148 |
149 |
198 |
200 |
201 |
--------------------------------------------------------------------------------
/src/components/treeLoading.vue:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
41 |
42 |
47 |
49 |
50 |
--------------------------------------------------------------------------------
/src/config.js:
--------------------------------------------------------------------------------
1 | export const NoInspect = []
2 |
3 | export const VueBuiltIn = ['KeepAlive', 'transition', 'TransitionGroup', 'Basic', 'Navigation', 'Data','Event']
4 |
--------------------------------------------------------------------------------
/src/helper/event.js:
--------------------------------------------------------------------------------
1 | export function addEventList (vm) {
2 | const eventList = { dom: [], com: [] }
3 |
4 | /** *************** addDOMEvent **********************/
5 | // 获取具有DOM事件的Vnode
6 | const VnodeListWithEvent = []
7 | function parseVnodehEvent (vnode, VnodeListWithEvent) {
8 | if (vnode.data && vnode.data.on && (!vnode.componentInstance)) {
9 | VnodeListWithEvent.push(vnode)
10 | }
11 | if (vnode.children) {
12 | vnode.children.map((vm, i) => {
13 | parseVnodehEvent(vm, VnodeListWithEvent)
14 | })
15 | }
16 | }
17 | parseVnodehEvent(vm._vnode, VnodeListWithEvent)
18 |
19 | VnodeListWithEvent.map((Vnode, i) => {
20 | const VnodeEvent = Vnode.data.on
21 | if (VnodeEvent) {
22 | const event = []
23 | for (const key in VnodeEvent) {
24 | // get eventFnName
25 | const eventFullFnName = VnodeEvent[key].fns.name
26 | let eventFnName = ''
27 | if (eventFullFnName === key) {
28 | //
29 | if (vm.$options.methods) {
30 | Object.keys(vm.$options.methods).map((m) => {
31 | if (VnodeEvent[key].fns.toString().indexOf(m) > -1) {
32 | eventFnName = m
33 | }
34 | })
35 | }
36 | } else {
37 | eventFnName = eventFullFnName.split(' ')[1]
38 | }
39 | // VnodeEvent[key].fns
40 | // if(!eventFnName){
41 | // debugger
42 | // }
43 |
44 | event.push({
45 | name: eventFnName||'inline-event',
46 | type: 'on' + key,
47 | fn: eventFnName ? vm[eventFnName] : VnodeEvent[key].fns
48 | })
49 | }
50 |
51 | eventList.dom.push({
52 | name: 'ele' + i,
53 | el: Vnode.elm,
54 | event: event,
55 | isShow: false
56 | })
57 |
58 | // debugger
59 | }
60 | })
61 |
62 | vm.$options.eventList = eventList
63 |
64 | /** *************** addCOMEvent **********************/
65 |
66 | // if(vm.$options.name === "Container01"){
67 | // debugger
68 |
69 | const ComEvent = vm.$options._parentListeners
70 |
71 | for (const key in ComEvent) {
72 | // get eventFnName
73 | const eventFullFnName = ComEvent[key].fns.name
74 | let eventFnName = ''
75 | if (eventFullFnName === key) {
76 | //
77 | let $parent = vm.$parent
78 | while (!eventFnName) {
79 | if ($parent.$options.methods) {
80 | Object.keys($parent.$options.methods).map((m) => {
81 | if (ComEvent[key].fns.toString().indexOf(m) > -1) {
82 | eventFnName = m
83 | }
84 | })
85 | }
86 | if (!$parent.$parent) {
87 | break
88 | }
89 | $parent = $parent.$parent
90 | }
91 | } else {
92 | eventFnName = eventFullFnName.split(' ')[1]
93 | }
94 |
95 | eventList.com.push({
96 | name: eventFnName,
97 | type: key,
98 | el: vm.el,
99 | fn: eventFnName ? vm[eventFnName] : ComEvent[key].fns
100 | })
101 | }
102 |
103 | // }
104 |
105 | //
106 | }
--------------------------------------------------------------------------------
/src/helper/imgs.js:
--------------------------------------------------------------------------------
1 | // logo
2 | export const comLabelLogo = 'data:image/jpg;base64,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'
3 |
--------------------------------------------------------------------------------
/src/helper/label.js:
--------------------------------------------------------------------------------
1 | import { comLabelLogo } from './imgs'
2 | // previous vue
3 | let preVm = null
4 | // clear DomEventLabel-fn
5 | let clearDomEventLabel = null
6 | const EventLabelCollection = []
7 | const componentsLabelProps = {
8 | attr: {
9 | className: 'vue-component-inspector'
10 | },
11 | style: {
12 | position: 'absolute',
13 | top: 0,
14 | left: 0,
15 | margin: '4px',
16 | background: '#a6dfa6',
17 | cursor: 'pointer',
18 | fontSize: '8px',
19 | zIndex: 10
20 | }
21 |
22 | }
23 | const componentsLabelImgProps = {
24 | attr: {
25 | src: comLabelLogo
26 | },
27 | style: {
28 | width: '20px',
29 | float: 'left'
30 | }
31 |
32 | }
33 | const eventIconProps = {
34 | attr: {
35 | className: 'el-icon-caret-left event-icon'
36 | },
37 | style: {
38 | fontSize: '31px',
39 | position: 'absolute',
40 | left: '-22px',
41 | top: '-7px',
42 | color: '#a6dfa2'
43 | }
44 |
45 | }
46 | const domEventLabelProps = {
47 | attr: {
48 | innerText: 'e',
49 | className: 'event-label'
50 | },
51 | style: {
52 | background: 'rgb(255, 255, 255)',
53 | color: 'rgb(166, 223, 162)',
54 | border: '3px solid rgb(166, 223, 162)',
55 | display: 'inline-block',
56 | borderRadius: '5px',
57 | padding: '3px 5px',
58 | position: 'absolute',
59 | top: '-1px',
60 | left: '186px',
61 | cursor: 'pointer',
62 | fontSize: '17px',
63 | lineHeight: '10px',
64 | marginLeft: '5px',
65 | zIndex: '10'
66 | }
67 |
68 | }
69 | // setElementProps
70 | function setElementProps (el, props) {
71 | for (const key in props) {
72 | if (key === 'attr') {
73 | for (const attrKey in props[key]) {
74 | el[attrKey] = props[key][attrKey]
75 | }
76 | }
77 | if (key === 'style') {
78 | for (const styleKey in props[key]) {
79 | el.style[styleKey] = props[key][styleKey]
80 | }
81 | }
82 | }
83 | }
84 | // createDomEventLabel
85 | function createDomEventLabel (vm) {
86 | function setPosition (nodeEventMap) {
87 | nodeEventMap.map((map, i) => {
88 | const offsetTop = map.eventNode.offsetTop
89 | const offsetLeft = map.eventNode.offsetLeft
90 | const top = offsetTop
91 | const left = map.eventNode.offsetWidth + offsetLeft
92 | setElementProps(map.eventLabel, { style: { top: (top + 'px'), left: (left + 'px') }})
93 | })
94 | }
95 | if (vm.$options.eventList) {
96 | const domEvent = vm.$options.eventList.dom
97 | const nodeEventMap = []
98 | // add label
99 | domEvent.map((e, i) => {
100 | const eventNode = e.el
101 |
102 | const eventIcon = document.createElement('i')
103 | setElementProps(eventIcon, eventIconProps)
104 | const span = document.createElement('span')
105 | setElementProps(span, domEventLabelProps)
106 | span.appendChild(eventIcon)
107 |
108 | e.eventLabel = span
109 | nodeEventMap.push({
110 | eventNode: eventNode,
111 | eventLabel: span
112 | })
113 | EventLabelCollection.push(span)
114 | // eventlabel add event
115 | span.addEventListener('click', () => {
116 | preVm.$options.eventList.dom.map((dom) => {
117 | if (dom.eventLabel === span) {
118 | setElementProps(span, { style: { color: '#409EFF', borderColor: '#409EFF' }})
119 | setElementProps(eventIcon, { style: { color: '#409EFF' }})
120 | dom.isShow = true
121 | } else {
122 | // debugger
123 | setElementProps(dom.eventLabel, { style: { color: '#a6dfa5', borderColor: '#a6dfa5' }})
124 | setElementProps(dom.eventLabel.getElementsByTagName('i')[0], { style: { color: '#a6dfa5' }})
125 | dom.isShow = false
126 | }
127 | })
128 | // updata view
129 | document.getElementById('event').__vue__.$forceUpdate()
130 | })
131 | })
132 | // add eventLabel
133 | nodeEventMap.map((map, i) => {
134 | map.eventNode.parentNode.appendChild(map.eventLabel)
135 | })
136 | // position
137 | setPosition(nodeEventMap)
138 | window.removeEventListener('resize', setPosition(nodeEventMap))
139 | window.addEventListener('resize', setPosition(nodeEventMap))
140 | return EventLabelCollection
141 | } else {
142 | return []
143 | }
144 | }
145 | // createComponentsLabel
146 | export function createComponentsLabel (el, vm, vmNname) {
147 | const div = document.createElement('div')
148 | div.title = `<${vmNname}/>`
149 | setElementProps(div, componentsLabelProps)
150 | // createImg
151 | const img = document.createElement('img')
152 | setElementProps(img, componentsLabelImgProps)
153 | div.appendChild(img)
154 | // setEvent
155 | div.addEventListener('click', (e) => {
156 | e.stopPropagation()
157 | e.preventDefault()
158 | // clear previous style
159 | if (preVm) {
160 | let el = preVm.$el
161 | if (preVm.$options.comment) { // comment
162 | el = el.parentNode
163 | }
164 | setElementProps(el, { style: { outline: '1px solid green' }})
165 | }
166 | // set previous vm
167 | preVm = vm
168 | // set curVm
169 | vm.$root.VCIIndex.change(vm)
170 | // set cur style
171 | setElementProps(el, { style: { outline: '3px solid red', outlineOffset: '-3px' }})
172 | // clearDomEventLabel
173 | clearDomEventLabel && clearDomEventLabel()
174 | // create event label
175 | const domEventLabel = createDomEventLabel(vm)
176 | // set clearDomEventLabel-fn
177 | vm.$root.clearDomEventLabel = clearDomEventLabel = function () {
178 | domEventLabel.map((v) => {
179 | v.remove()
180 | })
181 | }
182 | // set global $vm
183 | window.$vm = vm
184 | })
185 | // Append the created child element to the component parent element
186 | // el.parentNode.appendChild(div);
187 | // Append the created child element to the component element
188 | // el.appendChild(div);
189 | // positiong ComponentsLabel
190 | function setCreateComponentsLabelPosition (map) {
191 | map.map((map, i) => {
192 | const offsetTop = map.vmEl.offsetTop
193 | const offsetLeft = map.vmEl.offsetLeft
194 | const top = offsetTop
195 | // let left = map.vmEl.offsetWidth/2 + offsetLeft
196 | const left = offsetLeft
197 | setElementProps(map.componentsLabel, { style: { top: (top + 'px'), left: (left + 'px') }})
198 | })
199 | }
200 | window.setTimeout(() => {
201 | setCreateComponentsLabelPosition([{
202 | vmEl: el,
203 | componentsLabel: div
204 | }])
205 | }, 2000)
206 | window.addEventListener('resize', () => {
207 | setCreateComponentsLabelPosition([{
208 | vmEl: el,
209 | componentsLabel: div
210 | }])
211 | })
212 | return div
213 | }
214 |
215 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import { install } from './install'
2 | import { inBrowser } from './util/dom'
3 | const VCI = {
4 | install: install,
5 | version: '__VERSION__'
6 | }
7 | export default VCI
8 | if (inBrowser && window.Vue) {
9 | window.Vue.use(VCI,{
10 | noInspect:['ElPagination', 'ElDialog', 'ElAutocomplete', 'ElDropdown', 'ElDropdownMenu', 'ElDropdownItem', 'ElMenu', 'ElSubmenu', 'ElMenuItem', 'ElMenuItemGroup', 'ElInput', 'ElInputNumber', 'ElRadio', 'ElRadioGroup', 'ElRadioButton', 'ElCheckbox', 'ElCheckboxButton', 'ElCheckboxGroup', 'ElSwitch', 'ElSelect', 'ElOption', 'ElOptionGroup', 'ElButtonGroup', 'ElTable', 'ElTableColumn', 'ElDatePicker', 'ElTimeSelect', 'ElTimePicker', 'ElPopover', 'ElTooltip', 'ElBreadcrumb', 'ElBreadcrumbItem', 'ElForm', 'ElFormItem', 'ElTabs', 'ElTabPane', 'ElTag', 'ElTree', 'ElAlert', 'ElSlider', 'ElIcon', 'ElRow', 'ElCol', 'ElUpload', 'ElProgress', 'ElSpinner', 'ElBadge', 'ElCard', 'ElRate', 'ElSteps', 'ElStep', 'ElCarousel', 'ElScrollbar', 'ElCarouselItem', 'ElCollapse', 'ElCollapseItem', 'ElCascader', 'ElColorPicker', 'ElTransfer', 'ElContainer', 'ElHeader', 'ElAside', 'ElMain', 'ElFooter', 'ElTimeline', 'ElTimelineItem', 'ElLink', 'ElDivider', 'ElImage', 'ElCalendar', 'ElBacktop', 'ElPageHeader', 'ElCascaderPanel', 'ElAvatar', 'ElDrawer', 'ElPopconfirm', 'ElCollapseTransition', 'ElTreeNode', undefined, 'SvgIcon', 'SidebarItem','ElTableBody','ElTableHeader','ElSelectDropdown']
11 | })
12 | }
13 |
--------------------------------------------------------------------------------
/src/install.js:
--------------------------------------------------------------------------------
1 | import index from './components/index.vue'
2 | import page from './page/page.vue'
3 | import { isViewCom } from './util/util'
4 | import { NoInspect } from './config'
5 | import { addEventList } from './helper/event'
6 | import { createComponentsLabel } from './helper/label'
7 | export let _Vue
8 | export function install (Vue,options={}) {
9 | if (install.installed && _Vue === Vue) return
10 | install.installed = true
11 | _Vue = Vue
12 | // debugger
13 | let noInspect = options.noInspect||[]
14 | noInspect.map((v)=>{
15 | NoInspect.push(v)
16 | })
17 |
18 |
19 | const componentsLabelCollection = []
20 | // minxin mounted , destroyed
21 | Vue.mixin({
22 | mounted () {
23 | let el = this.$el
24 | const vmNname = this.$options.name
25 | if (this && this.$root === this) {
26 | // rootVm
27 |
28 | // set componentsLabelCollection
29 | this.$root.componentsLabelCollection = componentsLabelCollection
30 | this.$root.$options.fileUrl = 'root'
31 | // set curVm
32 | this.curVm = null
33 | }
34 | if (isViewCom(this)) {
35 | // remark selet element
36 | if (el.nodeType === 8) {
37 | el = el.parentNode
38 | this.$options.comment = true
39 | }
40 | /* const computedStyle = document.defaultView.getComputedStyle(el, null)
41 | const position = computedStyle.position
42 | if (position !== 'absolute' && position !== 'relative' && position !== 'fixed') {
43 | el.style.position = 'relative'
44 | }*/
45 | // Process Event
46 | window.setTimeout(() => {
47 | addEventList(this)
48 | })
49 | // add component label
50 | const componentsLabel = createComponentsLabel(el, this, vmNname)
51 | this.componentsLabel = componentsLabel
52 | componentsLabelCollection.push({ vmEl: el, componentsLabel: componentsLabel })
53 | }
54 | },
55 | destroyed () {
56 | this.componentsLabel && this.componentsLabel.remove()
57 | }
58 | })
59 | Vue.component('Page', page)
60 | Vue.component('VueComponentInspector', index)
61 | }
62 |
--------------------------------------------------------------------------------
/src/page/contaienr-01.vue:
--------------------------------------------------------------------------------
1 |
2 |
15 |
16 |
87 |
88 |
90 |
92 |
93 |
--------------------------------------------------------------------------------
/src/page/contaienr-02.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 | 组件A
4 |
5 |
6 |
58 |
59 |
68 |
70 |
71 |
--------------------------------------------------------------------------------
/src/page/contaienr-03.vue:
--------------------------------------------------------------------------------
1 |
2 |
12 |
13 |
94 |
95 |
97 |
99 |
100 |
--------------------------------------------------------------------------------
/src/page/page.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
44 |
46 |
48 |
49 |
--------------------------------------------------------------------------------
/src/util/dom.js:
--------------------------------------------------------------------------------
1 | /* @flow */
2 |
3 | export const inBrowser = typeof window !== 'undefined'
4 |
--------------------------------------------------------------------------------
/src/util/util.js:
--------------------------------------------------------------------------------
1 | import { NoInspect, VueBuiltIn } from './../config'
2 |
3 | export function isViewCom (vm) {
4 | // debugger
5 | const vmNname = vm.$options.name
6 | let ret = true
7 | if (!vmNname) { // not Name
8 | ret = false
9 | }
10 | if (NoInspect.indexOf(vmNname) > 0) { // NoInspect
11 | ret = false
12 | }
13 | if (VueBuiltIn.indexOf(vmNname) > 0) { // VueBuiltIn com
14 | ret = false
15 | }
16 | if (vmNname === 'VueComponentInspector') {
17 | ret = false
18 | }
19 | return ret
20 | }
21 |
22 | export function isPlainObject (obj) {
23 | return Object.prototype.toString.call(obj) === '[object Object]'
24 | }
25 |
--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zglz/vue-component-inspector/afcad8da6cd8b7ff3e3c714428c718fedf104523/yarn.lock
--------------------------------------------------------------------------------