Vue2.x开发Chrome插件记录

背景

作为一名web开发者,对Animate.css这个动画库不会陌生,它把常见的动画都封装了起来,非常实用。但是有时候在开发中,仅仅只是需要某一两个动画效果,把整个CSS文件都引入,这样不是太好。

需求就出现了,能不能有一个工具可以直接预览Animate.css对应的动画效果,并且生成对应的动画代码呢?

作为web开发者,平时跟Chrome浏览器打交道最多,于是就想着整一个Chrome插件可以及时预览对应Animate.css中的动画效果并生成对应的动画代码,这样在实际开发中碰到一些需要使用到Animate.css中的动画效果时,可以大大的提高我们的开发效率。

插件如下图所示:


** 插件下载地址 **
** 插件源码 **
** web网页版本 **

开始

** Chrome插件开发基本知识 **
在应用商店中下载下来的插件基本上都是以.crx为文件后缀,该文件其实就是一个压缩包,包括插件所需要的html、css、javascript、图片资源等等文件。

开发一个插件就跟我们平时做web开发流程没多大的区别,就是先搭好基本的页面,然后使用js来写交互逻辑等功能。

比如我这个插件的目录文件如下:


** manifest.json文件 **
文件中需要注意一下的mainfest.json(很重要)这个文件,这个json文件的作用是提供插件的各种信息,例如插件能够做的事情,以及插件的文件配置等等信息。下面是一个清单文件的示例:

{
    "manifest_version": 2,
    "name": "Prev CSS3 Animate",
    "description": "Preview CSS3 animation effects",
    "version": "1.0",
    "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
    "permissions": [
        "http://*/*",
        "https://*/*",
        "file:///*"
     ],
    "content_scripts": [
        {
            "matches": [
                "http://*/*",
                "file:///*/*"
            ],
            "css": ["dist/style.css"]
        }
    ],
    "browser_action": {
        "default_icon": "img/icon4.png",
        "default_popup": "index.html"
    }
}

第一行声明我们使用清单文件格式的版本 2,必须包含(版本 1 是旧的,已弃用,不建议使用)

接下来的部分定义扩展程序的名称、描述与版本。这些都会在 Chrome 浏览器中使用,向用户显示已安装的扩展程序,同时在 Chrome 网上应用店中向潜在的新用户显示您的扩展程序。名称应该简练,描述不要比一句话左右还长

browser_action 对应的是默认的logo(本文是icon4.png)以及文件入口(文本为index.html),这两个资源都必须在扩展程序包中存在,图片是扩展的显示,html是扩展具体运行的基础文件。

功能实现

整个插件的核心交互功能非常简单,如文章开头的动图所示,用户选择对相应动画,代码区域显示对应的代码。这种简单数据交互使用vuejs再适合不过了,vuejs基础知识这里就不再细说了。可直接拷贝代码

这里需要注意的一点是,chrome 扩展的运行环境有一些特殊要求,称为 Content Security Policy (CSP),使得通常的 vue 不能被正常使用。如果用的是 vue 1.x,那么可以下载 csp 版本,** 看这里 ** 如果是 2.x 版本,请参考官网文档的 ** 这一段 **

其实2.x解决cps问题很简单,只需要在manifest.json里面加入这样一行即可随意使用2.x版本的Vue

"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'"

核心代码:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <!-- 因为使用的webpack 所以直接饮用了打包后的文件 -->
        <link rel="stylesheet" href="dist/style.css">
    </head>
    <body>
        <div id="app-prev-css">
            <div class="header">Prev CSS3 Animate.css</div>
            <div class="prev-box">
                <div :class="[activeClass, errorClass]"></div>
            </div>
            <div class="select-line">
                <select v-model="selected">
                    <option v-for="(option,index) in options" :value="option">{{option}}</option>
                </select>
                <button type="button" @click="copyTips" class="copy-btn" data-clipboard-target="#copyCss">复制</button>
            </div>
            <div class="prev-css" v-html="cssText" id="copyCss" v-cloak>{{cssText}}</div>
            <div class="tips" v-show="isShow" v-cloak>复制成功!</div>
        </div>
        <!-- 因为使用的webpack 所以直接饮用了打包后的文件 -->
        <script src="dist/bundle.js"></script>
    </body>
</html>

CSS就不列出来了,可以在源代码中查看。

下面来使用vuejs来实现插件的功能。

<select v-model="selected">
    <option v-for="(option,index) in options" :value="option">{{option}}</option>
</select>

使用 v-for 指令根据一组数组的选项列表进行渲染。

用v-bind方法来绑定option的value值,代码如下所示:

在select中使用v-model方法来监听选中的值。

new Vue({
    el:"#app-prev-css",
    data () {
        return {
            selected:'bounce',
            activeClass: 'animated',
            errorClass: 'bounce',
            isShow:false,
            options:[
                'bounce','flash','pulse','rubberBand','shake','headShake','swing','tada','wobble','jello',
                'bounceIn','bounceInDown','bounceInLeft','bounceInRight','bounceInUp',
                'bounceOut','bounceOutDown','bounceOutLeft','bounceOutRight','bounceOutUp',
                'fadeIn','fadeInDown','fadeInDownBig','fadeInLeft','fadeInLeftBig','fadeInRight',
                'fadeInRightBig','fadeInUp','fadeInUpBig','fadeOut','fadeOutDown','fadeOutDownBig',
                'fadeOutLeft','fadeOutLeftBig','fadeOutRight','fadeOutRightBig','fadeOutUp','fadeOutUpBig',
                'flip','flipInX','flipInY','flipOutX','flipOutY','lightSpeedIn','lightSpeedOut',
                'rotateIn','rotateInDownLeft','rotateInDownRight','rotateInUpLeft','rotateInUpRight',
                'rotateOut','rotateOutDownLeft','rotateOutDownRight','rotateOutUpLeft','rotateOutUpRight',
                'slideInUp','slideInDown','slideInLeft','slideInRight','slideOutUp','slideOutDown','slideOutLeft',
                'slideOutRight','zoomIn','zoomInDown','zoomInLeft','zoomInRight','zoomInUp',
                'zoomOut','zoomOutDown','zoomOutLeft','zoomOutRight','zoomOutUp','hinge','rollIn','rollOut'
            ]
        }
    }
})

代码同步显示

接下来是代码同步功能,即在代码区域显示对应animate对齐的CSS代码。

开始之前先讲讲vuejs中的computed属性方法,可计算属性 (computed properties) 就是不存在于原始数据中,而是在运行时实时计算出来的属性。

computed:{
    cssText () {
        // 数据我单独放在json里面了 返回对应名字动画即可
        var  baseData = data[this.selected]

        // 处理数据 优化显示方式 换行 缩进代码 使用了showdown => html
        var converter =  new showdown.Converter({
          tables: true
        });
        baseData = converter.makeHtml(baseData);

        baseData = baseData.replace(/(.*?)gs/g,"<div>$1</div>")
        baseData = baseData.replace(/<p>|<\/p>/g,"")
        baseData = baseData.replace(/\b(sp)\b/g,"<span class='space'></span>")
        baseData = baseData.replace(/\b(sp2)\b/g,"<span class='space2'></span>")
        // 返回
        return baseData
    }
},

复制代码

使用了Clipboard插件,具体使用方法github地址看这里

<!-- 点击按钮绑定 data-clipboard-target="#copyCss" -->
<button type="button" @click="copyTips" class="copy-btn" data-clipboard-target="#copyCss">复制</button>

<!-- 代码区域使用 id copyCss-->
<div class="prev-css" v-html="cssText" id="copyCss" v-cloak>{{cssText}}</div>

接下来就是js

mounted:function() {
    this.$nextTick(function(){
        new Clipboard('.copy-btn');
    })
}

开发好之后,可以直接在chrome中运行来调试。打开扩展面板,勾选开发者模式,然后加载刚开发扩展所在的目录就可以直接运行

一个简单的插件就完成了,通过这一个简单的chrome插件就可以体验到vuejs在web开发中简单、优雅的魅力,还有什么理由不用起来呢。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容