起因

一直以来,我都是直接在浏览器 Tampermonkey 扩展页面直接新建用户脚本来开发的:

对于一些简单的脚本,这没有什么问题,即改即看。但当代码多了以后问题就来了,自带编辑器开发体验确实不太舒服,没有格式化,没有代码补全,无法模块化编写代码等等,这时候我就想寻找一个打包方案,让我们可以在自己的编辑器如 VSCode 里开发,这样就可以充分利用前端工程化的便利,提升开发体验。

常见的打包工具比如 webpack、parcel、rollup 等,首先排除 webpack(笑),然后试了下 parcel,效果不太理想,之后试了 rollup 感觉还可以。转眼想到要用 vue 开发,那就直接上 vite 吧 ,vite 也是用 rollup 来打包生产代码的。

直接打开 npm,看看有没有人造轮子,然后发现下面几个包:

  • gorilla (rollup 插件)
  • vite-plugin-tampermonkey
  • vite-plugin-monkey

这几个都符合基本需求,其中 gorilla 不能打包样式,另外两个插件都差不多,选了 vite-plugin-tampermonkey 进行改造。

修改后的插件: Github | npm

插件特点

  • 通过单独的配置文件或者 package.json 中的 tmHeader 字段来配置 Tampermonkey 的 Userscript Header
  • 构建生产时支持自动分析代码用到的 grant
  • 开发模式时默认导入所有 grant,并且把所有的 grant 方法加入到 unsafeWindow
  • 可通过简单配置,把引入的外部包 require 化,自动引入 jsdelivr CDN ,详情见下面的插件配置

开始之前

Vite 官方中文文档

Tampermonkey 文档

gorilla

vite-plugin-tampermonkey

vite-plugin-monkey

初始化项目

兼容性注意

Vite 需要 Node.js 版本 >= 12.0.0。然而,有些模板需要依赖更高的 Node 版本才能正常运行,当你的包管理器发出警告时,请注意升级你的 Node 版本。

使用 NPM:

$ npm create vite@latest

使用 Yarn:

$ yarn create vite

使用 PNPM:

$ pnpm create vite

按需选择框架

推荐使用 TypeScript

然后到项目目录开始安装依赖

插件使用

安装

yarn add vite-plugin-tm-userscript -D
# OR
npm install vite-plugin-tm-userscript -D

配置 vite.config.ts

import { defineConfig } from 'vite'
import Userscript from 'vite-plugin-tm-userscript' // https://vitejs.dev/config/
export default defineConfig({
plugins: [
Userscript({
externalGlobals: ['vue']
})
]
})

配置 Userscript Header

有四种方式来配置 Userscript Header, 优先级如下所示

  1. header.config.json
  2. header.config.js
  3. header.config.txt
  4. package.json 中的 tmHeader 字段

其中 header.config.txt 使用 Tampermonkey 头部注释配置,不会经过处理,直接插入脚本头部作为 Header 使用

其他三种格式按 json 格式配置,多个属性配置如 match 用数组表示,经过处理自动添加 grantrequire

示例配置见 example/header.config.js

使用 js 文件来配置的好处是可以有自动补全:

具体属性配置见 Tampermonkey 文档

插件配置

export interface TMPluginOptions {
entry?: string;
autoGrant?: boolean;
externalGlobals?: string[] | Record<string, string | string[]>;
}

externalGlobals

配置外部包,比如 vueaxios 等,减少打包体积,并且会自动声明 require ,如下配置:

三种配置形式,可自定义 CDN,不配置 CDN 的话默认使用 jsdelivr CDN

// 1
TMPlugin({
externalGlobals: ['jquery']
}) // 2
TMPlugin({
externalGlobals: {
'jquery': 'jQuery'
}
}) // 3
TMPlugin({
externalGlobals: {
'jquery': ['jQuery', 'https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js']
}
}) // => return {
rollupOptions: {
external: ['jquery']
output: {
globals: {
jquery: 'jQuery'
}
}
}
} // @require https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js

autoGrant

boolean 类型,默认为 true

自动分析代码中使用的 Tampermonkey 的 grant,并加入 Userscript Header 声明中

entry

入口文件,默认为 src/main.js 或者 src/main.ts

开发启动

npm run devyarn dev 运行开发服务,然后点击下图所示链接安装

生产打包

npm run buildyarn build 进行生产模式打包,打包文件放在 dist 文件夹里

然后可以发布到插件市场或者直接安装到浏览器

示例

https://github.com/asadahimeka/vite-plugin-tm-userscript/tree/master/example

说明

vite 配置额外说明

生产构建模式将强制配置 config.build:

  • 构建的包名为 package.jsonname必须填写)属性的驼峰模式,构建的文件名也与其相关
  • 文件打包格式为 iife,不压缩,不分离 css 文件
  • 额外配置了 rollupOptions,以支持其他功能

禁止 CSP(Content-Security-Policy)

在开发模式下,需要通过 script 标签注入 vite 的脚本,有些网站开启了 CSP(Content-Security-Policy),导致报错,可以安装 Chrome 插件 Disable Content-Security-Policy 或者 Always Disable Content-Security-Policy,来禁止 CSP(Content-Security-Policy)在开发时开启插件即可(其他时间记得关闭以保证网页浏览的安全性)


fin.

使用 Vite 插件开发构建 Tampermonkey 用户脚本的更多相关文章

  1. 安装用户脚本的福音:Tampermonkey(油猴)

    一直都知道网络的强大,NB的程序员大牛潜伏在我们身边.但是一直以来,如果想使用的一些特殊用途的浏览器插件都无法安装,今天被大神级的师兄给秒到了,原来这世上还有一个免费的用户脚本管理器,有了用户脚本管理 ...

  2. 使用Vite快速构建Vue3+ts+pinia脚手架

    一.前言 vue3的快速更新,很多IT发展快的地区在22开始都已经提上日程,小编所在的青岛好像最近才有点风波.vue3的人才在青岛还是比较稀缺的哈,纯属小编自己的看法,可能小编是个井底之蛙!! vue ...

  3. sh3.useradd 添加用户脚本

    1.写一个脚本: 添加10个用户user1到user10,密码同用户名,但要求只有用户不存在的情况下才能添加 #/bin/bash # ..};do if id user$i &> /d ...

  4. 【阿里云IoT+YF3300】8.物联网设备用户脚本开发

    除了我们必须熟悉的网页脚本,比如JavaScript.其实在工业自动化中,组态软件是必备脚本的,只是有的脚本语言风格类似C或类似Basic而已.比如昆仑通泰的组态屏中的组态软件.通过安装组态软件可以简 ...

  5. 工程师技术(五):Shell脚本的编写及测试、重定向输出的应用、使用特殊变量、编写一个判断脚本、编写一个批量添加用户脚本

    一.Shell脚本的编写及测 目标: 本例要求两个简单的Shell脚本程序,任务目标如下: 1> 编写一个面世问候 /root/helloworld.sh 脚本,执行后显示出一段话“Hello ...

  6. shell编写一个批量添加用户脚本

                                                          shell编写一个批量添加用户脚本 5.1问题 本例要求在虚拟机server0上创建/roo ...

  7. 基于 Egg.js 框架的 Node.js 服务构建之用户管理设计

    前言 近来公司需要构建一套 EMM(Enterprise Mobility Management)的管理平台,就这种面向企业的应用管理本身需要考虑的需求是十分复杂的,技术层面管理端和服务端构建是架构核 ...

  8. Vite插件开发纪实:vite-plugin-monitor(上)

    背景 最近在webpack项目里接入了Vite(dev mode),为开发提效.效果是真的猛. 项目启动速度提升70%-80%,HMR直接碾压webpack dev server 为了更加精准的计算收 ...

  9. 使用Groovy构建自己的脚本环境

    场景 在进行Web服务端开发的时候,发布前通常需要测试一遍.对于一个大一点的项目,最好的办法是写个自动化测试程序. 以Groovy为例,写测试代码之前通常的有如下几个操作 引用相关的类库 import ...

随机推荐

  1. 全面系统讲解CSS工作应用+面试一步搞定

    [TOC] 一.课程介绍 二.HTML基础强化 html常见元素和理解 html常见元素分类 head区元素:(不会在页面上留下元素) * meta * title * style * link * ...

  2. EF框架基础

    ORM概述: ORM全称是"对象 - 关系映射" . ORM是将关系数据库中的数据用对象的形式表现出来,并通过面向对象的方式将这些对象组织起来,实现系统业务逻辑的过程. Entit ...

  3. 界面跳转+信息传递+AS中如何将ADV转移到其他盘中

    今日所学:界面跳转 信息传递 遇到的问题: 昨天遇到不能新建java类,在网上百度了很多,大多原因是没有新建java类的模板,但是我有,换了一个新的新建的方式后,发现虽然能建立了,但在测试时还是不能页 ...

  4. sring框架的jdbc应用

      xml配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http: ...

  5. Python入门-程序测试

    1.功能测试 常规测试 #常规测试代码,一个模块写功能,一个模块调用功能 #=============模块1:gongneng_ceshi def func(v1, v2): return v1* v ...

  6. 使用Visual Studio 2019开发Qt程序

    安装Qt 如标题,你首先需要到 http://download.qt.io/ 去下载并安装Qt,并在引导下安装MSVC组件(这里不做过多解释) Visual Studio 2019 配置 打开VS20 ...

  7. SpringMVC踩坑2

    Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exc ...

  8. BurpSuite与Xray多级代理实现联动扫描

    Xray是长亭科技推出的,最经典的莫过于代理模式下的被动扫描,它使得整个过程可控且更加精细化: 代理模式下的基本架构为,扫描器作为中间人,首先原样转发流量,并返回服务器响应给浏览器等客户端,通讯两端都 ...

  9. SimpleDateFormat类的安全问题,这6个方案总有一个适合你

    摘要:你使用的SimpleDateFormat类还安全吗?为什么说SimpleDateFormat类不是线程安全的?带着问题从本文中寻求答案. 本文分享自华为云社区<[高并发]SimpleDat ...

  10. SSL及GMVPN握手协议详解

    之前写过一篇文章搞懂密码学基础及SSL/TLS协议,主要介绍了加密学的基础,并从整体上对SSL协议做了介绍.由于篇幅原因,SSL握手的详细流程没有深入介绍.本文将拆解握手流程,在消息级别对握手进行详细 ...