Vue开发移动端项目,这个工具对你一定有帮助

转载自:OmniDebug

https://juejin.cn/post/6949433236787298335

基于Vue.js开发移动端工程时,一些特定的问题和场景下,只能在移动端运行工程复现、追踪问题(比如在微信端内,在App容器内),桌面端的Devtools就没法用了。数次安装Electron版本devtools后,觉得调试起来太麻烦了,所以我决定把devtools搬进vConsole里

如果不知道什么是vConsole,可以看这里vConsole Readme

最终效果:

Github 地址 欢迎Star, 引入非常简单

import VConsole from "vconsole";
import Devtools from 'vue-vconsole-devtools'
Devtools.initPlugin(new VConsole());

效果图:

实现过程

分析完Vue、Vue-devtools、vConsole源码以后,似乎可行。步骤如下:

  1. 剥离Vue-devtools @front部分

  2. 实现@backend 和 @front 部分通信

  3. 实现front注入iframe

  4. iframe嵌入vConsole

  5. 制作npm包并发布

1. 剥离front

首先一个问题就是 Vue-devtools并不是一个库,所以npm上没有它,无法引用,其次这个工程也不适合作为库输出,因为它的打包方式比较特殊,还有这个工程本身的目的就是打包成一个可执行的App或者chrome插件,所以如果想引用它里面的代码,我想到最简单的方式就是拷贝了。。。所以剥离frontend非常简单,在Vue-devtools工程的package.json中增加script:"buildvc": "cd packages/shell-dev && cross-env NODE_ENV=production webpack \--progress \--hide-modules", 同时在shell-dev里增加一个文件叫 inject.js:

import { initDevTools } from '@front'
import Bridge from '@utils/bridge'

const targetWindow = window.parent;
document.body.style.overflow = "scroll";
initDevTools({
  connect (cb) {
    cb(new Bridge({
      listen (fn) {
        window.addEventListener('message', evt => {
          fn(evt.data)
        })
      },
      send (data) {
        targetWindow.postMessage(data, '*')
      }
    }))
  },
  onReload (reloadFn) {
    reloadFn.call();
  }
})

当然shell-dev里的webpack.config.js里 增加一个入口配置 inject: './src/inject.js'

打出来的包就是我们要的front部分,最终嵌入iframe里。

2. 实现通信

上面的inject.js中已经包含了 front部分 接收和发送消息的代码了。接下来完成backend部分的消息发送和接收,

import { initBackend } from '@back'
import Bridge from '@utils/bridge'

const initBackendWithTargetWindow = function(win,targetWindow){
  const bridge = new Bridge({
    listen (fn) {
      win.addEventListener('message', evt => {
        fn(evt.data)})
    },
    send (data) {
      targetWindow.postMessage(data, '*')
    }
  })
  
  initBackend(bridge)
}

export default { initBackendWithTargetWindow }

3. front嵌入iframe

这个比较麻烦,也遇到了一些兼容性问题,最终方案是:

  1. 把第一步打包的inject.js 重命名为 inject.txt
    
  2. 增加一个rawloader规则,识别txt
    
  3. 使用script.txt的方式插入到script标签中,然后插入iframe的body中
    
import injectString from './inject.txt'

function inject (scriptContent, done) {
  const script = document.getElementById('vue-iframe').contentWindow.document.createElement('script')
  script.text = scriptContent
  document.getElementById('vue-iframe').contentWindow.document.body.appendChild(script)
}

inject(injectString)

4. iframe嵌入vconsole

实现一个plugin类,继承VConsolePlugin,然后实现对应的方法即可,具体文档可以查看VConsole文档vConsole Readme

class VConsoleVueTab extends VConsolePlugin {

  constructor(...args) {
    super(...args);
  }
  onRenderTab(cb){
    cb(`<iframe id="vue-iframe" style="width:100%;position:absolute;top:0;bottom:0;min-height:100%;"></iframe>`);
  }
  onReady() {
    target = document.getElementById('vue-iframe')
    targetWindow = target.contentWindow;
    be.initBackendWithTargetWindow(window,targetWindow);    
  }

  onShow() {    
    injectOnce(injectString)
  }
}

5. 制作npm包并发布

这一步需要打包发布,并且优化

const initPlugin = function(vConsole){
  var tab = new VConsoleVueTab('vue', 'Vue');
  vConsole.addPlugin(tab);
}
export default {
  initPlugin
}

最后

欢迎关注【前端瓶子君】✿✿ヽ(°▽°)ノ✿

回复「算法」,加入前端算法源码编程群,每日一刷(工作日),每题瓶子君都会很认真的解答哟!

回复「交流」,吹吹水、聊聊技术、吐吐槽!

回复「阅读」,每日刷刷高质量好文!

如果这篇文章对你有帮助,「在看」是最大的支持

》》面试官也在看的算法资料《《

“在看和转发”就是最大的支持

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作为一个 AI,我没有实际的开发经验。但是我可以告诉你一些关于 Vue 3 移动端开发项目的一般经验。 首先,Vue 3 是一个非常流行的 JavaScript 框架,用于构建用户界面。它具有响应式数据绑定、组件化开发和简洁直观的语法等特点,非常适合移动端开发。 在使用 Vue 3 开发移动端项目时,你可以选择使用 Vue CLI 创建项目,这样可以快速搭建基本的项目结构,并且集成了许多常用的工具和插件。 对于移动端开发,你可能需要使用 Vue Router 进行路由管理,这样可以实现页面之间的跳转和导航。另外,你还可以使用 Vuex 进行状态管理,这对于大型应用程序非常有用。 在移动端开发中,你还需要考虑适配不同的设备和屏幕大小。可以使用 CSS 媒体查询或者使用第三方库(如 Vant)来实现响应式布局和样式。 此外,移动端开发还需要考虑性能优化和用户体验。你可以使用 Vue 3 提供的优化技术,如异步组件、懒加载和代码分割等来提高应用程序的加载速度和性能。 最后,记得进行移动端的测试和调试。可以使用 Chrome 开发工具移动端模拟器进行测试,并利用 Vue 的调试工具进行调试。 总结起来,Vue 3 在移动端开发中具有很多优势,但你仍然需要根据项目的需求和特点做出合适的选择和调整。希望对你有所帮助!如果你有其他问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值