vite-plugin-monkey
vite plugin server and build *.user.js for Tampermonkey and Violentmonkey and Greasemonkey
feature
- support Tampermonkey and Violentmonkey and Greasemonkey
- inject userscript comment to build bundle
- auto open *.user.js in default browser when userscript change
- external cdn url inject to userscript @require
- full typescript support and vite feature
install
pnpm add -D vite-plugin-monkey
config
export interface MonkeyOption {
/**
* userscript entry file path
*/
entry: string;
userscript: MonkeyUserScript;
format?: Format;
server?: {
/**
* auto open *.user.js in default browser when userscript comment change or vite server first start
* @default true
*/
open?: boolean;
/**
* name prefix, distinguish server.user.js and build.user.js in monkey extension install list
* @default 'dev:'
*/
prefix?: string | ((name: string) => string);
};
build?: {
/**
* build bundle userscript file name, it should end with '.user.js'
* @default (package.json.name||'monkey')+'.user.js'
*/
fileName?: string;
/**
* @example
* {
* vue:'Vue',
* // need manually set userscript.require = ['https://unpkg.com/vue@3.0.0/dist/vue.global.js']
* vuex:['Vuex', 'https://unpkg.com/vuex@4.0.0/dist/vuex.global.js'],
* // recommended this, plugin will auto add this url to userscript.require
* vuex:['Vuex', (version)=>`https://unpkg.com/vuex@${version}/dist/vuex.global.js`],
* // better recommended this
* vuex:['Vuex', (version, name)=>`https://unpkg.com/${name}@${version}/dist/vuex.global.js`],
* // or this
* }
*
*/
externalGlobals?: Record<
string,
string | [string, string | ((version: string, name: string) => string)]
>;
/**
* according to final code bundle, auto inject GM_* or GM.* to userscript comment grant
*
* the judgment is based on String.prototype.includes
* @default true
*/
autoGrant?: boolean;
};
}
/**
* UserScript, merge metadata from Greasemonkey, Tampermonkey, Violentmonkey, Greasyfork
*/
export type MonkeyUserScript = GreasemonkeyUserScript &
TampermonkeyUserScript &
ViolentmonkeyUserScript &
GreasyforkUserScript &
MergemonkeyUserScript;
- GreasemonkeyUserScript
- TampermonkeyUserScript
- ViolentmonkeyUserScript
- GreasyforkUserScript
- MergemonkeyUserScript
/**
* format userscript comment
*/
export type Format = {
/**
* @description note font_width/font_family, suggest fixed-width font
* @default 2, true
*/
align?: number | boolean | AlignFunc;
};
export type AlignFunc = (
p0: [string, ...string[]][]
) => [string, ...string[]][];
example
see test/example/vite.config.ts
build file see test/example/dist/example-project.user.js
example with vue
note
CSP
in dev server, userscript will run between two origin
so if host enable CSP, you can solve it in the following ways
- chrome - Disable Content-Security-Policy
- edge - Disable Content-Security-Policy
- firefox - disable
security.csp.enable
in theabout:config
menu
Polyfill
because of vitejs/vite#1639, now you can not use @vitejs/plugin-legacy
the following is a feasible solution by @require cdn
import { defineConfig } from 'vite';
import monkeyPlugin from 'vite-plugin-monkey';
export default defineConfig({
plugins: [
vue(),
monkeyPlugin({
userscript: {
require: [
// polyfill all
'https://cdn.jsdelivr.net/npm/core-js-bundle@latest/minified.js',
// or use polyfill.io
// https://polyfill.io/v3/polyfill.min.js
],
},
}),
],
});