前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Chrome Extension in CLJS —— 搭建开发环境

Chrome Extension in CLJS —— 搭建开发环境

作者头像
^_^肥仔John
发布于 2018-01-18 10:02:48
发布于 2018-01-18 10:02:48
2.2K00
代码可运行
举报
运行总次数:0
代码可运行

前言

 磨刀不误砍柴工,本篇将介绍如何搭建Chrome插件的ClojureScript开发环境。 具体工具栈:vim(paredit,tslime,vim-clojure-static,vim-fireplace) + leiningen(lein-cljsbuild,lein-doo,lein-ancient) + com.cemerick/piggieback

写得要爽

 首先抛开将cljs编译为js、调试、测试和发布等问题,首先第一要务是写得爽~  cljs中最让人心烦的就是括号(),过去我想能否改个语法以换行来代替括号呢?而paredit.vim正好解决这个问题。

安装

在.vimrc中添加

代码语言:javascript
代码运行次数:0
运行
复制
Plugin 'paredit.vim'

在vim中运行

代码语言:javascript
代码运行次数:0
运行
复制
:source %
:PluginInstall

设置<Leader>

代码语言:javascript
代码运行次数:0
运行
复制
" 设置<Leader>let mapleader=','
let g:mapleader=','

用法

  1. 输入([{",会自动生成)]}",并且光标位于其中,vim处于insert状态;
  2. normal模式时,输入<Leader>+W会生成括号包裹住当前光标所在的表达式;
  3. normal模式时,输入<Leader>+w+[会生成[]包裹住当前光标所在的表达式;
  4. normal模式时,输入<Leader>+w+"会生成""包裹住当前光标所在的表达式。

更多用法就通过:help paredit查看paredit的文档即可。

编译环境

 cljs要被编译为js后才能被运行,这里我采用leiningen。 在shell中运行

代码语言:javascript
代码运行次数:0
运行
复制
# 创建工程
$ lein new crx-demo
$ cd crx-demo

工程目录中的project.clj就是工程文件,我们将其修改如下

代码语言:javascript
代码运行次数:0
运行
复制
(defproject crx-demo "0.1.0-SNAPSHOT"
  :description "crx-demo"
  :urnl "http://fsjohnhuang.cnblogs.com"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.8.0"]               ;; 通过dependencies声明项目依赖项
                 [org.clojure/clojurescript "1.9.908"]]
  :plugins [[lein-cljsbuild "1.1.7"]]                        ;; 通过plugins声明leiningen的插件,然后就可以通过lein cljsbuild调用lein-cljsbuild这个插件了
  :jvm-opts ["-Xmx1g"]                                        ;; 设置JVM的堆容量,有时编译失败是应为堆太小
  :cljsbuild {:builds
              [{:id "browser_action"
                :source-paths ["src/browser_action"]
                :compiler {:main browser-action.core
                           :output-to "resources/public/browser_action/js/ignoreme.js"
                           :output-dir "resources/public/browser_action/js/out"
                           :asset-path "browser_action/js/out"
                           :optimizations :none              ;; 注意:为提高编译效率,必须将优化项设置为:none
                           :source-map true
                           :source-map-timestamp true}}
               {:id "content_scripts"
                :source-paths ["src/content_scripts"]
                :compiler {:main content-scripts.core
                           :output-to "resources/public/content_scripts/js/content_scripts.js"
                           :output-dir "resources/public/content_scripts/js/out"
                           :asset-path "content_scripts/js/out"
                           :optimizations :whitespace
                           :source-map true
                           :source-map-timestamp true}}}]}
  :aliases {"build" ["cljsbuild" "auto" "browser_action" "content_scripts"] ;; 设置别名,那么通过lein build就可一次性编译browser_action和content_scripts两个子项目了。
  })

 上述配置很明显我是将browser_action和content_scripts作为两个独立的子项目,其实Chrome插件中Browser ActionPage ActionContent ScriptsBackground等均是相对独立的模块相互并不依存,并且它们运行的方式和环境不尽相同,因此将它们作为独立子项目配置、编译和优化更适合。   然后新建resources/public/img目录,并附上名为icon.jpg的图标即可。 &esmp;然后在resources/public下新建manifest.json文件,修改内容如下

代码语言:javascript
代码运行次数:0
运行
复制
{
  "manifest_version": 2,
  "name": "crx-demo",
  "version": "1.0.0",
  "description": "crx-demo",
  "icons":
  {
    "16": "img/icon.jpg",
    "48": "img/icon.jpg",
    "128": "img/icon.jpg"
  },
  "browser_action":
  {
    "default_icon": "img/icon.jpg",
    "default_title": "crx-demo",
    "default_popup": "browser_action.html"
  },
  "content_scripts":
  [
        {
            "matches": ["*://*/*"],
            "js": ["content_scripts/js/core.js"],
            "run_at": "document_start"
        }
  ],
  "permissions": ["tabs", "storage"]
}

 接下来新建resources/public/browser_action.html,并修改内容如下

代码语言:javascript
代码运行次数:0
运行
复制
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <script src="browser_action/js/out/goog/base.js"></script>
  <script src="browser_action/js/out/goog/deps.js"></script>
  <script src="browser_action/js/out/cljs_deps.js"></script>
  <script src="browser_action.js"></script>
</body>
</html>

 到这一步我们会发现哪来的browser_action.js啊?先别焦急,这里涉及到Browser Action的运行环境与google closure compiler输出不兼容的问题。

Browser Action/Popup运行环境

 这里有个限制,就是default_popup所指向页面中不能存在内联脚本,而optimizations :none时google closure compiler会输出如下东东到ignoreme.js

代码语言:javascript
代码运行次数:0
运行
复制
var CLOSURE_UNCOMPILED_DEFINES = {};
var CLOSURE_NO_DEPS = true;
if(typeof goog == "undefined") document.write('<script src="resources/public/browser_action/js/out/goog/base.js"></script>');
document.write('<script src="resources/public/browser_action/js/out/goog/deps.js"></script>');
document.write('<script src="resources/public/browser_action/js/out/cljs_deps.js"></script>');
document.write('<script>if (typeof goog == "undefined") console.warn("ClojureScript could not load :main, did you forget to specify :asset-path?");</script>');
document.write('<script>goog.require("process.env");</script>');
document.write('<script>goog.require("crx_demo.core");</script>');

这很明显就是加入内联脚本嘛~~~所以我们要手工修改一下,新增一个resources/public/browser_action.js,然后添加如下内容

代码语言:javascript
代码运行次数:0
运行
复制
goog.require("process.env")
goog.require("crx_demo.core")

这里我们就搞定Browser Action/Popup的编译运行环境了^_^。大家有没有发现goog.require("crx_demo.core")这一句呢?我们的命名空间名称不是crx-demo.core吗?注意了,编译后不仅路径上-会变成_,连在goog中声明的命名空间名称也会将-变成了_

Content Scripts运行环境

 由于content scripts是直接运行脚本,没有页面让我们如popup那样控制脚本加载方式和顺序,因此只能通过optimizations :whitespace将所有依赖打包成一个js文件了。也就是说编译起来会相对慢很多~很多~多~~~

开发得爽

 到这里我们似乎可写上一小段cljs,然后编译运行了。且慢,没有任何智能提示就算了,还时不时要上网查阅API DOC,你确定要这样开发下去?

在vim中查看API DOC

 通过vim-fireplace我们可以手不离vim,查阅API文档,和查阅项目代码定义哦! 1.装vim插件

代码语言:javascript
代码运行次数:0
运行
复制
Plugin 'tpope/vim-fireplace'

在vim中运行

代码语言:javascript
代码运行次数:0
运行
复制
:source %
:PluginInstall

2.安装nRepl中间件piggieback  nRepl就是网络repl,可以接收客户端的脚本,然后将运行结果回显到客户端。我们可以通过lein repl启动Clojure的nRepl。  而fireplace则是集成到vim上连接nRepl的客户端,但默认启动的仅仅是Clojure的nRepl,所以要通过中间件附加cljs的nRepl。这是我们只需在project.clj中添加依赖即可。

代码语言:javascript
代码运行次数:0
运行
复制
:dependencies [[com.cemerick/piggieback "0.2.2"]]
:repl-options {:port 9000
               :nrepl-middleware [cemerick.piggieback/wrap-cljs-repl]}

 在shell中更新依赖lein deps 3.设置fireplace监听端口  在项目目录下创建文件,echo 9000 > .nreplport 4.启动nRepl,lein repl  这时在vim中输入:Source map就会看到cljs.core/map的定义,若不行则按如下设置:

代码语言:javascript
代码运行次数:0
运行
复制
:Connect
Protocol: nrepl
Host: localhost
Port: 9000
Scope connection to: ~/crx-dome

这样就设置好fireplace和nrepl间的链接了。 5.别开心太早  不知道是什么原因我们只能用fireplace中部分的功能而已,如通过:Source <symbol>查看定义,:FindDoc <keyword>查看匹配的Docstring,但无法通过:Doc <symbol>来查看某标识的Docstring。  另外若要通过:Source <symbol>查看当前项目的定义时,请先lein build将项目编译好,否则无法查看。另外一个十分重要的信息是,在optimizations不为:none的项目下的文件是无法执行fireplace的指令的,所以在开发Content Scrpts时就十分痛苦了~~~

 那有什么其他办法呢?不怕有tslime.vim帮我们啊!

tslime.vim

 tslime.vim让我们可以通过快捷键将vim中内容快速地复制到repl中执行 1.安装vim插件

代码语言:javascript
代码运行次数:0
运行
复制
Plugin 'jgdavey/tslime.vim'

在vim中运行

代码语言:javascript
代码运行次数:0
运行
复制
:source %
:PluginInstall

2..vimrc配置

代码语言:javascript
代码运行次数:0
运行
复制
" 设置复制的内容自动粘贴到tmux的当前session和当前window中
let g:tslime_always_current_session = 1 let g:tslime_always_current_window = 1

vmap <C-c><C-c> <Plug>SendSelectionToTmux
nmap <C-c><C-c> <Plug>NormalModeSendToTmux
nmap <C-c>r <Plug>SetTmuxVars

3.将clojure repl升级cljs repl  通过lein repl我们建立了一个cljs nrepl供fireplace使用,但在终端中我们看到的是一个clojure的repl,而tslime恰好要用的就是这个终端的repl。那现在我们只要在clojure repl中执行(cemerick.piggieback/cljs-repl (cljs.repl.rhino/repl-env))即可。 然后就可以在vim中把光标移动到相应的表达式上按<C-c><C-c>,那么这个表达式就会自动复制粘贴到repl中执行了。

美化输出

 由于cljs拥有比js更为丰富的数据类型,也就是说直接将他们输出到浏览器的console中时,显示的格式会不太清晰。于是我们需要为浏览器安装插件,但通过devtools我们就不用显式为浏览器安装插件也能达到效果(太神奇了!) 在project.clj中加入

代码语言:javascript
代码运行次数:0
运行
复制
:dependencies [[binaryage/devtools "0.9.4"]]
;; 在要格式化输出的compiler中添加
:compiler {:preloads [devtools.preload]
           :external-config {:devtools/config {:features-to-install [:formatters :hints :async]}}}

然后在代码中通过js/console.logjs/console.info等输出的内容就会被格式化的了。

单元测试很重要

 为了保证开发的质量,单元测试怎么能少呢?在project.clj中加入

代码语言:javascript
代码运行次数:0
运行
复制
:plugins [[lein-doo "0.1.7"]]

然后在test/crx_demo下新建一个runner.cljs文件,并写入如下内容

代码语言:javascript
代码运行次数:0
运行
复制
(ns crx-demo.runner
  (:require-macros [doo.runners :refer [doo-tests]])
  (:require [crx-demo.content-scripts.util-test]))

;; 假设我们要对crx-demo.content-scripts.util下的函数作单元测试,而测试用例则写在crx-demo.content-scripts.util-test中
(doo-tests 'crx-demo.content-scripts.util-test)

然后创建crx-demo.content-scripts.util-test.cljs测试用例文件

代码语言:javascript
代码运行次数:0
运行
复制
(ns crx-demo.content-scripts.util-test
  (:require-macros [cljs.test :refer [deftest is are testing async]]
  (:require [crx-demo.content-scripts.util :as u]))

(deftest test-all-upper-case?
  (testing "all-upper-case?"
    (are [x] (true? x)
      (u/all-upper-case? "abCd")
      (u/all-upper-case? "ABCD"))))

(deftest test-all-lower-case?
  (testing "all-lower-case?"
    (is (true? (u/all-lower-case? "cinG")))))

(deftest test-get-async
  (async done
    (u/get-async (fn [item]
                   (is (seq item))
                   (done)))))

然后再新增一个测试用的子项目

代码语言:javascript
代码运行次数:0
运行
复制
{:id "test-proj"
 :source-paths ["src/content_scripts" "test/crx_demo"]
 :compiler {:target :nodejs                   ;;运行目标环境是nodejs
            :main crx-demo.runner
            :output-to "out/test.js"
            :output-dir "out/out"
            :optimizations :none
            :source-map true
            :source-map-timestamp true}}

然后在shell中输入lein doo node test-proj

发布前引入externs

 辛苦开发后我们将optimizations设置为advanced后编译优化,将作品发布时发现类似于如下的报错

代码语言:javascript
代码运行次数:0
运行
复制
Uncaught TypeError: sa.B is not a function

这究竟是什么回事呢? 开发时最多就是将optimizations设置为simple,这时标识符并没有被压缩,所以如chrome.runtime.onMessage.addListener等外部定义标识符依然是原装的。但启用advanced编译模式后,由于上述外部标识符的定义并不纳入GCC的编译范围,因此GCC仅仅将调用部分代码压缩了,而定义部分还是原封不动,那么在运行时调用中自然而然就找不到相应的定义咯。Cljs早已为我们找到了解决办法,那就是添加extern文件,extern文件中描述外部函数、变量等声明,那么GCC根据extern中的声明将不对调用代码中同签名的标识符作压缩。 示例:chrome的extern文件chrome.js片段

代码语言:javascript
代码运行次数:0
运行
复制
/**
 * @constructor
 */
function MessageSender(){}
/** @type {!Tab|undefined} */
MessageSender.prototype.tab

配置

1.访问https://github.com/google/closure-compiler/tree/master/contrib/externs,将chrome.js和chrome_extensions.js下载到项目中的externs目录下 2.配置project.clj文件

代码语言:javascript
代码运行次数:0
运行
复制
:compiler {:externs ["externs/chrome.js" "externs/chrome_extensions.js"]}

总结

最后得到的project.clj为

代码语言:javascript
代码运行次数:0
运行
复制
(defproject crx-demo "0.1.0-SNAPSHOT"
  :description "crx-demo"
  :urnl "http://fsjohnhuang.cnblogs.com"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.8.0"]
                 [org.clojure/clojurescript "1.9.908"]
                 [binaryage/devtools "0.9.4"]
                 [com.cemerick/piggieback "0.2.2"]]
  :plugins [[lein-cljsbuild "1.1.7"]
            [lein-doo "0.1.7"]
            [lein-ancient "0.6.12"]] ;; 通过`lein ancient upgrade``lein ancient upgrade:plugins`更新依赖项
  :clean-targets ^{:protect false} [:target-path "out" "resources/public/background" "resources/public/content_scripts" "resources/public/browser_action"]
  :jvm-opts ["-Xmx1g"]
  :repl-options {:port 9000
                 :nrepl-middleware [cemerick.piggieback/wrap-cljs-repl]}
  :cljsbuild {:builds
              [{:id "browser_action"
                :source-paths ["src/browser_action"]
                :compiler {:main browser-action.core
                           :output-to "resources/public/browser_action/js/ignoreme.js"
                           :output-dir "resources/public/browser_action/js/out"
                           :asset-path "browser_action/js/out"
                           :optimizations :none
                           :source-map true
                           :source-map-timestamp true
                           :externs ["externs/chrome.js" "externs/chrome_extensions.js"]
                           :preloads [devtools.preload]
                           :external-config {:devtools/config {:features-to-install [:formatters :hints :async]}}}}
               {:id "content_scripts"
                :source-paths ["src/content_scripts"]
                :compiler {:main content-scripts.core
                           :output-to "resources/public/content_scripts/js/content_scripts.js"
                           :output-dir "resources/public/content_scripts/js/out"
                           :asset-path "content_scripts/js/out"
                           :optimizations :whitespace
                           :source-map true
                           :source-map-timestamp true
                           :externs ["externs/chrome.js" "externs/chrome_extensions.js"]
                           :preloads [devtools.preload]
                           :external-config {:devtools/config {:features-to-install [:formatters :hints :async]}}}}]}
  :aliases {"build" ["cljsbuild" "auto" "browser_action" "content_scripts"]
            "test"  ["doo" "node" "test-proj"]})

随着对cljs的应用的深入,我会逐步完善上述配置^_^

参考

http://astashov.github.io/blog/2014/07/30/perfect-clojurescript-development-environment-with-vim/ https://github.com/emezeske/lein-cljsbuild https://nvbn.github.io/2014/12/07/chrome-extension-clojurescript/ https://github.com/binaryage/cljs-devtools/blob/master/docs/configuration.md https://clojurescript.org/tools/testing https://github.com/google/closure-compiler/wiki/Externs-For-Common-Libraries

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-10-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
(cljs/run-at (JSVM. :browser) "搭建刚好可用的开发环境!")
前言  书接上一回,在了解cljs基本语法后并在clojurescript.net的奇特错误提示后,我们必须痛定思痛地搭建一个本地的开发环境,以便后续深入地学习cljs。 现有的构建工具  由于浏览器仅能运行JS,而无法直接运行cljs,因此我们需要搭建一个预编译环境将cljs编译成JS后再在浏览器中运行。预编译无非就是JVM和Nodejs两个环境,但具体使用时有如下几种构建工具。 直接JVM编译 Lein方案 Boot方案 Lumo方案 Shadow-cljs方案 cljs/tool方案  其中Lein
^_^肥仔John
2018/01/18
9500
ClojureScript魔法堂:搭建开发环境
一、前言                                 当看到Lisp等函数式编程语言的语法是 (say (concat "hello" "world")) 这样的时候,我就有种深入学习的冲动,因为它的语法和自己一直使用的Java、C#都不同,酷比了!(我承认我是语法控^_^)又由于我主要玩的是JavaScript,恰好ClojureScript就是纯函数式的JS超集,于是决定以ClojureScript作为函数式编程的起点。(虽然JavaScript具有函数式语言的特点:函数为一等公民,
^_^肥仔John
2018/01/18
1.2K0
使用 ClojureScript 开发浏览器插件的过程与收获
本文链接较多,可点击本文https://liujiacai.net/blog/2017/11/22/create-firefox-chrome-extensions-in-clojurescript/去个人博客浏览。
飞驰的西瓜
2022/07/26
8670
使用 ClojureScript 开发浏览器插件的过程与收获
[1084]windows搭建clojure开发环境
关于clojure是什么东西就自行百度了,简单说就是用Lisp语言写的程序,编译成.class放在jvm上面跑,所以是需要jre的。独立的clojure可以从官方网站找到,目前稳定版本是1.8,官网https://clojure.org/index。下载后是一个zip,里面有个jar是clojure-1.8.0.jar,可以像常用的jar那样运行,这样会得到一个REPL交互环境,当然需要预先配置好jre(java8)。
周小董
2021/11/30
2.3K0
[1084]windows搭建clojure开发环境
前端构建:Source Maps详解
一、前言                            当使用CoffeeScript、ClojureScript编写前端脚本时,当使用Less、Sacc编写样式规则时,是否觉得调试时无法准确找到源码位置呢?当使用jquery.min.js等经压缩后的工具库时,是否觉得连调试的门都不不知道在哪呢?   针对上述问题,google为我们提供了Source Maps这一解决方案,以下内容为对Source Maps的学习记录,以便日后查阅。   由于篇幅较长,特设目录一坨!   二、示例 三、Sou
^_^肥仔John
2018/01/18
1.7K0
前端构建:Source Maps详解
从 0 开始入门 Chrome Ext 安全(一) -- 了解一个 Chrome Ext
在2019年初,微软正式选择了Chromium作为默认浏览器,并放弃edge的发展。并在19年4月8日,Edge正式放出了基于Chromium开发的Edge Dev浏览器,并提供了兼容Chrome Ext的配套插件管理。再加上国内的大小国产浏览器大多都是基于Chromium开发的,Chrome的插件体系越来越影响着广大的人群。
Seebug漏洞平台
2019/11/28
1.2K0
简单的写一个chrome的浏览器插件
首先每个插件在一个目录中,需要一个manifast.json文件,里面的大概是这样的:
前Thoughtworks-杨焱
2021/12/07
5010
Chrome扩展开发
注:content_scripts段中的代码会在页面加载对应阶段"document_start", “document_end”, or "document_idle"自动注入 但是脚本运行在与页面独立的上下文中,无法访问到原页面的脚本上下文资源 如需访问原页面脚本上下文,可在content_scripts脚本中将web_accessible_resources段中声明的脚本注入到document中 样例: js/content-script.js
路过君
2020/06/19
9690
Chrome Extension
Chrome插件是一个用Web技术开发、用来增强浏览器功能的软件,它其实就是一个由HTML、CSS、JS、图片等资源组成的一个.crx后缀的压缩包
江米小枣
2020/06/15
3K0
编译期类型检查 in ClojureScript
前言  话说"动态类型一时爽,代码重构火葬场",虽然有很多不同的意见(请参考),但我们看到势头强劲的TypeScript和Flow.js,也能感知到静态类型在某程度上能帮助我们写出更健壮的代码(当然要基于充分的单元测试上啦)。  ClojureScript与JavaScript一样采取动态类型,但由于需要通过Google Closure Compiler编译后才能运行,因此我们可以如同JS那样借助GCC的注解来引入编译时类型检查,达到同样静态类型的效果。 配置项目设置 GCC的编译时类型检查仅当optim
^_^肥仔John
2018/01/18
1K0
Chrome插件manifest.json文件详解
开发Chrome插件首先就是配置manifest.json文件了,利用它我们可以定义在什么时机以及在什么网页执行什么脚本,有一些什么行为,下面我一起来看看这个文件有哪些配置项以及有什么作用:
越陌度阡
2022/05/06
2K0
如何使用谷歌插件为网站注入代码
在浏览网站时,受限于网站的缺陷,我们通常都会写一些脚本和插件来进行扩展,常规方法有油猴和谷歌插件两种,油猴也是一种插件,使用起来很方便,今天要讲的是如何通过谷歌插件进行注入。
子舒
2022/06/09
1.5K0
如何使用谷歌插件为网站注入代码
数栈技术干货:从0到1实现谷歌插件开发探索及应用
数栈是云原生—站式数据中台PaaS,我们在github和gitee上有一个有趣的开源项目:FlinkX,记得给我们点个star!star!star!
袋鼠云数栈
2021/05/14
1.2K0
数栈技术干货:从0到1实现谷歌插件开发探索及应用
简单说 如何做一个chrome 去广告插件
这次我们先来简单接触一下,了解一点入门知识,先做一个简单的demo,就先去除一下CSDN网页上的广告。
FEWY
2019/05/29
1.3K0
简单说 如何做一个chrome 去广告插件
谷歌浏览器扩展程序开发
先说为何要学这个,我们公司部署项目的时候有一个选择按钮,每次都得选中才能提交!于是就。。。 直接上代码! 配置文件:manifest.json { "name": "选中页面复选框", "version": "1.0.0", "manifest_version": 2, "description": "选中页面当中的复选框", "permissions" : ["tabs","http://*/"], "icons": {
苦咖啡
2018/05/08
1.1K0
如何实现一个谷歌浏览器插件
直接将脚本注入到页面中,但是也可以包含CSS文件,但是在注入CSS文件时,要小心,否则会覆盖网页原本的样式。content-scripts中的JS程序和原始页面共享DOM,但是和原始页面的JS不是在同一个环境下运行的,所以我们是无法访问到原始页面中定义的变量的因为是是注入到页面中的,所以在安全策略上不能访问大部分的API,除了下面的四种:
zhaozhen
2021/07/15
1.5K0
如何实现一个谷歌浏览器插件
Chrome扩展开发入门体验
****前言**** Chrome浏览器扩展开发算是相当简单的,基本只要掌握HTML+CSS+Javascript,即可快速开发一个属于你的Chrome插件! ---- ****Chrome扩展基本目录结构**** manifest.json 这是一个配置文件,里面记录了扩展的使用范围、作者、版本、其余需要加载的文件等内容; icon.png 这个一看便知,就是扩展的图标~~~ popup.html 点击扩展图标,弹出的面板页面(如果在manifest.json中配置了default
AlicFeng
2018/06/08
1.1K0
【干货】Chrome插件(扩展)开发全攻略
严格来讲,我们正在说的东西应该叫Chrome扩展(Chrome Extension),真正意义上的Chrome插件是更底层的浏览器功能扩展,可能需要对浏览器源码有一定掌握才有能力去开发。鉴于Chrome插件的叫法已经习惯,本文也全部采用这种叫法,但读者需深知本文所描述的Chrome插件实际上指的是Chrome扩展。
winty
2020/07/23
12K1
【干货】Chrome插件(扩展)开发全攻略
如何快速地开发一个chrome扩展插件
说到现如今最流行的浏览器,那么一定是chrome,无论是它的速度,还是它的稳定性,还是它的简洁,都让人爱不释手,此外,更多的人选择它的理由是它有着丰富的扩展插件,这些扩展插件让你的浏览器变得异常强大,让你的浏览器不仅仅是浏览器。
程序那些事儿
2023/07/24
6200
如何快速地开发一个chrome扩展插件
一天学会Chrome插件开发
如前所述,它包含了一些插件的元数据,作为chrome的入口文件,可以理解为插件的程序清单,那么它到底做了什么事情呢? 结合示例,我们细细来看:
疯狂的技术宅
2019/03/28
9200
一天学会Chrome插件开发
相关推荐
(cljs/run-at (JSVM. :browser) "搭建刚好可用的开发环境!")
更多 >
目录
  • 前言
  • 写得要爽
    • 安装
    • 设置<Leader>键
    • 用法
  • 编译环境
    • Browser Action/Popup运行环境
    • Content Scripts运行环境
  • 开发得爽
    • 在vim中查看API DOC
    • tslime.vim
  • 美化输出
  • 单元测试很重要
  • 发布前引入externs
    • 配置
  • 总结
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档