├── .gitignore ├── LICENSE ├── README.md ├── README.zh-CN.md ├── jsconfig.json ├── package-lock.json ├── package.json ├── src ├── header.js ├── main.js ├── pages │ ├── index.js │ └── www │ │ ├── index.js │ │ └── packages │ │ ├── TestA │ │ ├── apis │ │ │ └── index.js │ │ ├── components │ │ │ └── Count.svelte │ │ ├── index.js │ │ ├── styles │ │ │ └── index.css │ │ └── views │ │ │ ├── TestA.svelte │ │ │ └── index.js │ │ └── index.js ├── router.js └── utils │ └── index.js └── vite.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 小淳 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # svelte-tampermonkey 2 | > 🚀 Vite + Svelte Tampermonkey boilerplate 3 | 4 | **English | [简体中文](README.zh-CN.md)** 5 | 6 | ## Header 7 | 1. `src/header.js` can edit tampermonkey header info 8 | 9 | ## Start 10 | 1. `npm install` 11 | 2. `npm run dev` 12 | 3. Copy `dist/main.user.dev.js` to tampermonkey 13 | 4. Visit [百度](https://www.baidu.com),you can see the effect in the upper right corner 14 | - Every time you modify the code, it will be hot updated. You only need to refresh the page 15 | 16 | ## Build 17 | 1. `npm run build` 18 | 2. Release `dist/main.user.js` 19 | 20 | 21 | ## QA 22 | 23 | ### Why Vite + Svelte ? 24 | 1. "no runtime" and The file size is small enough to meet the script release requirements 25 | 2. Tree Shaking 26 | 3. The responsive provided by Svelte fully meets the needs of script development 27 | 4. Rollup packaging is fast 28 | 5. More... 29 | 30 | ### Why Not TypeScript ? 31 | 1. This is not absolute. Of course, you can use ts 32 | 2. Scripts often iterate very fast. In most cases, using TS will only increase the mental burden 33 | 3. Reduce unnecessary trouble and make development more flexible 34 | 35 | ### Why design the directory structure like this 36 | 1. In order to meet most of the needs 37 | 2. Facilitate the decoupling of all modules without affecting each other's development 38 | 39 | ## Directory Structure 40 | ``` 41 | ├─dist 42 | └─src 43 | ├─pages 44 | │ └─www 45 | │ └─packages 46 | │ └─TestA 47 | │ ├─apis 48 | │ ├─components 49 | │ └─views 50 | └─utils 51 | ``` 52 | 53 | ### Development Suggestions 54 | 1. The folders under `pages` are recommended to be classified according to **the secondary domain name**, for example: 55 | - www.baidu.com => www 56 | - test.baidu.com => test 57 | 2. If you need a responsive div, create a new `svelte file` under `views` to write it 58 | 3. In other cases, you can write JS files normally -------------------------------------------------------------------------------- /README.zh-CN.md: -------------------------------------------------------------------------------- 1 | # svelte-tampermonkey 2 | > 🚀基于Vite + Svelte,面向全业务场景的Tampermonkey油猴脚本开发脚手架 3 | > 4 | **[English](README.md) | 简体中文** 5 | 6 | ## Header 7 | 1. `src/header.js`可修改tampermonkey的信息 8 | 9 | ## 起步 10 | 1. `npm install` 11 | 2. `npm run dev` 12 | 3. 将`dist/main.user.dev.js`的内容添加到tampermonkey中 13 | 4. 访问[百度](https://www.baidu.com),即可在右上角看到效果 14 | - 每次修改代码会热更新,只需要刷新页面即可 15 | 16 | ## 发布 17 | 1. `npm run build` 18 | 2. 将`dist/main.user.js`的代码发布 19 | 20 | 21 | ## QA 22 | 23 | ### 为什么选择Vite + Svelte 24 | 1. "no runtime" 产物体积足够小,满足脚本发布要求 25 | 2. Tree Shaking 26 | 3. Svelte提供的响应式完全满足脚本开发需求 27 | 4. Rollup打包速度快 28 | 5. More... 29 | 30 | ### 为什么不使用TypeScript 31 | 1. 首先这并不是绝对的,项目当然可以使用ts 32 | 2. 脚本往往迭代速度都是很快的,大部分情况下使用ts只会徒增心智负担 33 | 3. 减少不必要的麻烦,使开发更加灵活 34 | 35 | ### 为什么这样设计目录结构 36 | 1. 为了满足绝大部分的业务场景 37 | 2. 方便所有模块解耦,互不影响开发 38 | 3. 满足最小可重构原则 39 | 40 | ## 结构 41 | ``` 42 | ├─dist 43 | └─src 44 | ├─pages 45 | │ └─www 46 | │ └─packages 47 | │ └─TestA 48 | │ ├─apis 49 | │ ├─components 50 | │ └─views 51 | └─utils 52 | ``` 53 | 54 | ### 开发建议 55 | 1. `pages`下的文件夹建议根据二级域名去分类,例如: 56 | - www.baidu.com => www 57 | - test.baidu.com => test 58 | 2. 需要响应式的div就在`views`下新建`svelte文件`进行编写 59 | 3. 其他场景正常编写js文件即可 -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "moduleResolution": "node", 4 | "target": "esnext", 5 | "module": "esnext", 6 | /** 7 | * svelte-preprocess cannot figure out whether you have 8 | * a value or a type, so tell TypeScript to enforce using 9 | * `import type` instead of `import` for Types. 10 | */ 11 | "isolatedModules": true, 12 | "resolveJsonModule": true, 13 | /** 14 | * To have warnings / errors of the Svelte compiler at the 15 | * correct position, enable source maps by default. 16 | */ 17 | "sourceMap": true, 18 | "esModuleInterop": true, 19 | "skipLibCheck": true, 20 | "forceConsistentCasingInFileNames": true, 21 | "baseUrl": ".", 22 | /** 23 | * Typecheck JS in `.svelte` and `.js` files by default. 24 | * Disable this if you'd like to use dynamic types. 25 | */ 26 | "checkJs": true 27 | }, 28 | /** 29 | * Use global.d.ts instead of compilerOptions.types 30 | * to avoid limiting type declarations. 31 | */ 32 | "include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.svelte"] 33 | } 34 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-tampermonkey", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "svelte-tampermonkey", 9 | "version": "0.0.0", 10 | "devDependencies": { 11 | "@sveltejs/vite-plugin-svelte": "^1.0.0-next.30", 12 | "svelte": "^3.58.0", 13 | "vite": "^4.2.1" 14 | } 15 | }, 16 | "node_modules/@esbuild/android-arm": { 17 | "version": "0.17.16", 18 | "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.17.16.tgz", 19 | "integrity": "sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==", 20 | "cpu": [ 21 | "arm" 22 | ], 23 | "dev": true, 24 | "optional": true, 25 | "os": [ 26 | "android" 27 | ], 28 | "engines": { 29 | "node": ">=12" 30 | } 31 | }, 32 | "node_modules/@esbuild/android-arm64": { 33 | "version": "0.17.16", 34 | "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.17.16.tgz", 35 | "integrity": "sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==", 36 | "cpu": [ 37 | "arm64" 38 | ], 39 | "dev": true, 40 | "optional": true, 41 | "os": [ 42 | "android" 43 | ], 44 | "engines": { 45 | "node": ">=12" 46 | } 47 | }, 48 | "node_modules/@esbuild/android-x64": { 49 | "version": "0.17.16", 50 | "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.17.16.tgz", 51 | "integrity": "sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==", 52 | "cpu": [ 53 | "x64" 54 | ], 55 | "dev": true, 56 | "optional": true, 57 | "os": [ 58 | "android" 59 | ], 60 | "engines": { 61 | "node": ">=12" 62 | } 63 | }, 64 | "node_modules/@esbuild/darwin-arm64": { 65 | "version": "0.17.16", 66 | "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.16.tgz", 67 | "integrity": "sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==", 68 | "cpu": [ 69 | "arm64" 70 | ], 71 | "dev": true, 72 | "optional": true, 73 | "os": [ 74 | "darwin" 75 | ], 76 | "engines": { 77 | "node": ">=12" 78 | } 79 | }, 80 | "node_modules/@esbuild/darwin-x64": { 81 | "version": "0.17.16", 82 | "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.17.16.tgz", 83 | "integrity": "sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==", 84 | "cpu": [ 85 | "x64" 86 | ], 87 | "dev": true, 88 | "optional": true, 89 | "os": [ 90 | "darwin" 91 | ], 92 | "engines": { 93 | "node": ">=12" 94 | } 95 | }, 96 | "node_modules/@esbuild/freebsd-arm64": { 97 | "version": "0.17.16", 98 | "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.16.tgz", 99 | "integrity": "sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==", 100 | "cpu": [ 101 | "arm64" 102 | ], 103 | "dev": true, 104 | "optional": true, 105 | "os": [ 106 | "freebsd" 107 | ], 108 | "engines": { 109 | "node": ">=12" 110 | } 111 | }, 112 | "node_modules/@esbuild/freebsd-x64": { 113 | "version": "0.17.16", 114 | "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.16.tgz", 115 | "integrity": "sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==", 116 | "cpu": [ 117 | "x64" 118 | ], 119 | "dev": true, 120 | "optional": true, 121 | "os": [ 122 | "freebsd" 123 | ], 124 | "engines": { 125 | "node": ">=12" 126 | } 127 | }, 128 | "node_modules/@esbuild/linux-arm": { 129 | "version": "0.17.16", 130 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.17.16.tgz", 131 | "integrity": "sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==", 132 | "cpu": [ 133 | "arm" 134 | ], 135 | "dev": true, 136 | "optional": true, 137 | "os": [ 138 | "linux" 139 | ], 140 | "engines": { 141 | "node": ">=12" 142 | } 143 | }, 144 | "node_modules/@esbuild/linux-arm64": { 145 | "version": "0.17.16", 146 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.17.16.tgz", 147 | "integrity": "sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==", 148 | "cpu": [ 149 | "arm64" 150 | ], 151 | "dev": true, 152 | "optional": true, 153 | "os": [ 154 | "linux" 155 | ], 156 | "engines": { 157 | "node": ">=12" 158 | } 159 | }, 160 | "node_modules/@esbuild/linux-ia32": { 161 | "version": "0.17.16", 162 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.17.16.tgz", 163 | "integrity": "sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==", 164 | "cpu": [ 165 | "ia32" 166 | ], 167 | "dev": true, 168 | "optional": true, 169 | "os": [ 170 | "linux" 171 | ], 172 | "engines": { 173 | "node": ">=12" 174 | } 175 | }, 176 | "node_modules/@esbuild/linux-loong64": { 177 | "version": "0.17.16", 178 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.17.16.tgz", 179 | "integrity": "sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==", 180 | "cpu": [ 181 | "loong64" 182 | ], 183 | "dev": true, 184 | "optional": true, 185 | "os": [ 186 | "linux" 187 | ], 188 | "engines": { 189 | "node": ">=12" 190 | } 191 | }, 192 | "node_modules/@esbuild/linux-mips64el": { 193 | "version": "0.17.16", 194 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.16.tgz", 195 | "integrity": "sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==", 196 | "cpu": [ 197 | "mips64el" 198 | ], 199 | "dev": true, 200 | "optional": true, 201 | "os": [ 202 | "linux" 203 | ], 204 | "engines": { 205 | "node": ">=12" 206 | } 207 | }, 208 | "node_modules/@esbuild/linux-ppc64": { 209 | "version": "0.17.16", 210 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.16.tgz", 211 | "integrity": "sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==", 212 | "cpu": [ 213 | "ppc64" 214 | ], 215 | "dev": true, 216 | "optional": true, 217 | "os": [ 218 | "linux" 219 | ], 220 | "engines": { 221 | "node": ">=12" 222 | } 223 | }, 224 | "node_modules/@esbuild/linux-riscv64": { 225 | "version": "0.17.16", 226 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.16.tgz", 227 | "integrity": "sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==", 228 | "cpu": [ 229 | "riscv64" 230 | ], 231 | "dev": true, 232 | "optional": true, 233 | "os": [ 234 | "linux" 235 | ], 236 | "engines": { 237 | "node": ">=12" 238 | } 239 | }, 240 | "node_modules/@esbuild/linux-s390x": { 241 | "version": "0.17.16", 242 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.17.16.tgz", 243 | "integrity": "sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==", 244 | "cpu": [ 245 | "s390x" 246 | ], 247 | "dev": true, 248 | "optional": true, 249 | "os": [ 250 | "linux" 251 | ], 252 | "engines": { 253 | "node": ">=12" 254 | } 255 | }, 256 | "node_modules/@esbuild/linux-x64": { 257 | "version": "0.17.16", 258 | "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.17.16.tgz", 259 | "integrity": "sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==", 260 | "cpu": [ 261 | "x64" 262 | ], 263 | "dev": true, 264 | "optional": true, 265 | "os": [ 266 | "linux" 267 | ], 268 | "engines": { 269 | "node": ">=12" 270 | } 271 | }, 272 | "node_modules/@esbuild/netbsd-x64": { 273 | "version": "0.17.16", 274 | "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.16.tgz", 275 | "integrity": "sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==", 276 | "cpu": [ 277 | "x64" 278 | ], 279 | "dev": true, 280 | "optional": true, 281 | "os": [ 282 | "netbsd" 283 | ], 284 | "engines": { 285 | "node": ">=12" 286 | } 287 | }, 288 | "node_modules/@esbuild/openbsd-x64": { 289 | "version": "0.17.16", 290 | "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.16.tgz", 291 | "integrity": "sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==", 292 | "cpu": [ 293 | "x64" 294 | ], 295 | "dev": true, 296 | "optional": true, 297 | "os": [ 298 | "openbsd" 299 | ], 300 | "engines": { 301 | "node": ">=12" 302 | } 303 | }, 304 | "node_modules/@esbuild/sunos-x64": { 305 | "version": "0.17.16", 306 | "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.17.16.tgz", 307 | "integrity": "sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==", 308 | "cpu": [ 309 | "x64" 310 | ], 311 | "dev": true, 312 | "optional": true, 313 | "os": [ 314 | "sunos" 315 | ], 316 | "engines": { 317 | "node": ">=12" 318 | } 319 | }, 320 | "node_modules/@esbuild/win32-arm64": { 321 | "version": "0.17.16", 322 | "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.17.16.tgz", 323 | "integrity": "sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==", 324 | "cpu": [ 325 | "arm64" 326 | ], 327 | "dev": true, 328 | "optional": true, 329 | "os": [ 330 | "win32" 331 | ], 332 | "engines": { 333 | "node": ">=12" 334 | } 335 | }, 336 | "node_modules/@esbuild/win32-ia32": { 337 | "version": "0.17.16", 338 | "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.17.16.tgz", 339 | "integrity": "sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==", 340 | "cpu": [ 341 | "ia32" 342 | ], 343 | "dev": true, 344 | "optional": true, 345 | "os": [ 346 | "win32" 347 | ], 348 | "engines": { 349 | "node": ">=12" 350 | } 351 | }, 352 | "node_modules/@esbuild/win32-x64": { 353 | "version": "0.17.16", 354 | "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.17.16.tgz", 355 | "integrity": "sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==", 356 | "cpu": [ 357 | "x64" 358 | ], 359 | "dev": true, 360 | "optional": true, 361 | "os": [ 362 | "win32" 363 | ], 364 | "engines": { 365 | "node": ">=12" 366 | } 367 | }, 368 | "node_modules/@rollup/pluginutils": { 369 | "version": "4.1.2", 370 | "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-4.1.2.tgz", 371 | "integrity": "sha512-ROn4qvkxP9SyPeHaf7uQC/GPFY6L/OWy9+bd9AwcjOAWQwxRscoEyAUD8qCY5o5iL4jqQwoLk2kaTKJPb/HwzQ==", 372 | "dev": true, 373 | "dependencies": { 374 | "estree-walker": "^2.0.1", 375 | "picomatch": "^2.2.2" 376 | }, 377 | "engines": { 378 | "node": ">= 8.0.0" 379 | } 380 | }, 381 | "node_modules/@sveltejs/vite-plugin-svelte": { 382 | "version": "1.0.0-next.37", 383 | "resolved": "https://registry.npmmirror.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.37.tgz", 384 | "integrity": "sha512-EdSXw2rXeOahNrQfMJVZxa/NxZxW1a0TiBI3s+pVxnxU14hEQtnkLtdbTFhnceu22gJpNPFSIJRcIwRBBDQIeA==", 385 | "dev": true, 386 | "dependencies": { 387 | "@rollup/pluginutils": "^4.1.2", 388 | "debug": "^4.3.3", 389 | "kleur": "^4.1.4", 390 | "magic-string": "^0.25.7", 391 | "svelte-hmr": "^0.14.9" 392 | }, 393 | "engines": { 394 | "node": "^14.13.1 || >= 16" 395 | }, 396 | "peerDependencies": { 397 | "diff-match-patch": "^1.0.5", 398 | "svelte": "^3.44.0", 399 | "vite": "^2.7.0" 400 | }, 401 | "peerDependenciesMeta": { 402 | "diff-match-patch": { 403 | "optional": true 404 | } 405 | } 406 | }, 407 | "node_modules/debug": { 408 | "version": "4.3.3", 409 | "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.3.tgz", 410 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 411 | "dev": true, 412 | "dependencies": { 413 | "ms": "2.1.2" 414 | }, 415 | "engines": { 416 | "node": ">=6.0" 417 | }, 418 | "peerDependenciesMeta": { 419 | "supports-color": { 420 | "optional": true 421 | } 422 | } 423 | }, 424 | "node_modules/esbuild": { 425 | "version": "0.17.16", 426 | "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.17.16.tgz", 427 | "integrity": "sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==", 428 | "dev": true, 429 | "hasInstallScript": true, 430 | "bin": { 431 | "esbuild": "bin/esbuild" 432 | }, 433 | "engines": { 434 | "node": ">=12" 435 | }, 436 | "optionalDependencies": { 437 | "@esbuild/android-arm": "0.17.16", 438 | "@esbuild/android-arm64": "0.17.16", 439 | "@esbuild/android-x64": "0.17.16", 440 | "@esbuild/darwin-arm64": "0.17.16", 441 | "@esbuild/darwin-x64": "0.17.16", 442 | "@esbuild/freebsd-arm64": "0.17.16", 443 | "@esbuild/freebsd-x64": "0.17.16", 444 | "@esbuild/linux-arm": "0.17.16", 445 | "@esbuild/linux-arm64": "0.17.16", 446 | "@esbuild/linux-ia32": "0.17.16", 447 | "@esbuild/linux-loong64": "0.17.16", 448 | "@esbuild/linux-mips64el": "0.17.16", 449 | "@esbuild/linux-ppc64": "0.17.16", 450 | "@esbuild/linux-riscv64": "0.17.16", 451 | "@esbuild/linux-s390x": "0.17.16", 452 | "@esbuild/linux-x64": "0.17.16", 453 | "@esbuild/netbsd-x64": "0.17.16", 454 | "@esbuild/openbsd-x64": "0.17.16", 455 | "@esbuild/sunos-x64": "0.17.16", 456 | "@esbuild/win32-arm64": "0.17.16", 457 | "@esbuild/win32-ia32": "0.17.16", 458 | "@esbuild/win32-x64": "0.17.16" 459 | } 460 | }, 461 | "node_modules/estree-walker": { 462 | "version": "2.0.2", 463 | "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", 464 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 465 | "dev": true 466 | }, 467 | "node_modules/fsevents": { 468 | "version": "2.3.2", 469 | "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", 470 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 471 | "dev": true, 472 | "hasInstallScript": true, 473 | "optional": true, 474 | "os": [ 475 | "darwin" 476 | ], 477 | "engines": { 478 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 479 | } 480 | }, 481 | "node_modules/function-bind": { 482 | "version": "1.1.1", 483 | "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz", 484 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 485 | "dev": true 486 | }, 487 | "node_modules/has": { 488 | "version": "1.0.3", 489 | "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", 490 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 491 | "dev": true, 492 | "dependencies": { 493 | "function-bind": "^1.1.1" 494 | }, 495 | "engines": { 496 | "node": ">= 0.4.0" 497 | } 498 | }, 499 | "node_modules/is-core-module": { 500 | "version": "2.12.0", 501 | "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.12.0.tgz", 502 | "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", 503 | "dev": true, 504 | "dependencies": { 505 | "has": "^1.0.3" 506 | } 507 | }, 508 | "node_modules/kleur": { 509 | "version": "4.1.4", 510 | "resolved": "https://registry.npmmirror.com/kleur/-/kleur-4.1.4.tgz", 511 | "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==", 512 | "dev": true, 513 | "engines": { 514 | "node": ">=6" 515 | } 516 | }, 517 | "node_modules/magic-string": { 518 | "version": "0.25.7", 519 | "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.7.tgz", 520 | "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", 521 | "dev": true, 522 | "dependencies": { 523 | "sourcemap-codec": "^1.4.4" 524 | } 525 | }, 526 | "node_modules/ms": { 527 | "version": "2.1.2", 528 | "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", 529 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 530 | "dev": true 531 | }, 532 | "node_modules/nanoid": { 533 | "version": "3.3.6", 534 | "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz", 535 | "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", 536 | "dev": true, 537 | "bin": { 538 | "nanoid": "bin/nanoid.cjs" 539 | }, 540 | "engines": { 541 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 542 | } 543 | }, 544 | "node_modules/path-parse": { 545 | "version": "1.0.7", 546 | "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", 547 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 548 | "dev": true 549 | }, 550 | "node_modules/picocolors": { 551 | "version": "1.0.0", 552 | "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", 553 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 554 | "dev": true 555 | }, 556 | "node_modules/picomatch": { 557 | "version": "2.3.1", 558 | "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", 559 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 560 | "dev": true, 561 | "engines": { 562 | "node": ">=8.6" 563 | } 564 | }, 565 | "node_modules/postcss": { 566 | "version": "8.4.21", 567 | "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.21.tgz", 568 | "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", 569 | "dev": true, 570 | "dependencies": { 571 | "nanoid": "^3.3.4", 572 | "picocolors": "^1.0.0", 573 | "source-map-js": "^1.0.2" 574 | }, 575 | "engines": { 576 | "node": "^10 || ^12 || >=14" 577 | } 578 | }, 579 | "node_modules/resolve": { 580 | "version": "1.22.2", 581 | "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.2.tgz", 582 | "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", 583 | "dev": true, 584 | "dependencies": { 585 | "is-core-module": "^2.11.0", 586 | "path-parse": "^1.0.7", 587 | "supports-preserve-symlinks-flag": "^1.0.0" 588 | }, 589 | "bin": { 590 | "resolve": "bin/resolve" 591 | } 592 | }, 593 | "node_modules/rollup": { 594 | "version": "3.20.2", 595 | "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.20.2.tgz", 596 | "integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==", 597 | "dev": true, 598 | "bin": { 599 | "rollup": "dist/bin/rollup" 600 | }, 601 | "engines": { 602 | "node": ">=14.18.0", 603 | "npm": ">=8.0.0" 604 | }, 605 | "optionalDependencies": { 606 | "fsevents": "~2.3.2" 607 | } 608 | }, 609 | "node_modules/source-map-js": { 610 | "version": "1.0.2", 611 | "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", 612 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 613 | "dev": true, 614 | "engines": { 615 | "node": ">=0.10.0" 616 | } 617 | }, 618 | "node_modules/sourcemap-codec": { 619 | "version": "1.4.8", 620 | "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 621 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", 622 | "dev": true 623 | }, 624 | "node_modules/supports-preserve-symlinks-flag": { 625 | "version": "1.0.0", 626 | "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 627 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 628 | "dev": true, 629 | "engines": { 630 | "node": ">= 0.4" 631 | } 632 | }, 633 | "node_modules/svelte": { 634 | "version": "3.58.0", 635 | "resolved": "https://registry.npmmirror.com/svelte/-/svelte-3.58.0.tgz", 636 | "integrity": "sha512-brIBNNB76mXFmU/Kerm4wFnkskBbluBDCjx/8TcpYRb298Yh2dztS2kQ6bhtjMcvUhd5ynClfwpz5h2gnzdQ1A==", 637 | "dev": true, 638 | "engines": { 639 | "node": ">= 8" 640 | } 641 | }, 642 | "node_modules/svelte-hmr": { 643 | "version": "0.14.9", 644 | "resolved": "https://registry.npmmirror.com/svelte-hmr/-/svelte-hmr-0.14.9.tgz", 645 | "integrity": "sha512-bKE9+4qb4sAnA+TKHiYurUl970rjA0XmlP9TEP7K/ncyWz3m81kA4HOgmlZK/7irGK7gzZlaPDI3cmf8fp/+tg==", 646 | "dev": true, 647 | "peerDependencies": { 648 | "svelte": ">=3.19.0" 649 | } 650 | }, 651 | "node_modules/vite": { 652 | "version": "4.2.1", 653 | "resolved": "https://registry.npmmirror.com/vite/-/vite-4.2.1.tgz", 654 | "integrity": "sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==", 655 | "dev": true, 656 | "dependencies": { 657 | "esbuild": "^0.17.5", 658 | "postcss": "^8.4.21", 659 | "resolve": "^1.22.1", 660 | "rollup": "^3.18.0" 661 | }, 662 | "bin": { 663 | "vite": "bin/vite.js" 664 | }, 665 | "engines": { 666 | "node": "^14.18.0 || >=16.0.0" 667 | }, 668 | "optionalDependencies": { 669 | "fsevents": "~2.3.2" 670 | }, 671 | "peerDependencies": { 672 | "@types/node": ">= 14", 673 | "less": "*", 674 | "sass": "*", 675 | "stylus": "*", 676 | "sugarss": "*", 677 | "terser": "^5.4.0" 678 | }, 679 | "peerDependenciesMeta": { 680 | "@types/node": { 681 | "optional": true 682 | }, 683 | "less": { 684 | "optional": true 685 | }, 686 | "sass": { 687 | "optional": true 688 | }, 689 | "stylus": { 690 | "optional": true 691 | }, 692 | "sugarss": { 693 | "optional": true 694 | }, 695 | "terser": { 696 | "optional": true 697 | } 698 | } 699 | } 700 | } 701 | } 702 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-tampermonkey", 3 | "private": true, 4 | "version": "0.0.0", 5 | "scripts": { 6 | "dev": "vite build --mode dev", 7 | "build": "vite build --mode prod" 8 | }, 9 | "devDependencies": { 10 | "@sveltejs/vite-plugin-svelte": "^1.0.0-next.30", 11 | "svelte": "^3.58.0", 12 | "vite": "^4.2.1" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/header.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name svelte-tampermonkey 3 | // @license MIT 4 | // @namespace https://github.com/qianjiachun 5 | // @version 2022.02.17.01 6 | // @author 小淳 7 | // @match *://www.baidu.com/* 8 | // @grant GM_xmlhttpRequest 9 | // ==/UserScript== -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import {initRouter} from "./router.js" 2 | 3 | initRouter(); -------------------------------------------------------------------------------- /src/pages/index.js: -------------------------------------------------------------------------------- 1 | // import all pages and export 2 | // recommend: pages match domain. example www.baidu.com => www, page1.baidu.com => page1 3 | import www from "./www" 4 | export default { 5 | www 6 | } -------------------------------------------------------------------------------- /src/pages/www/index.js: -------------------------------------------------------------------------------- 1 | import {initPkg} from "./packages" 2 | 3 | function beforeInit() { 4 | // before packages init 5 | } 6 | 7 | function init() { 8 | beforeInit(); 9 | initPkg(); 10 | } 11 | 12 | export default { 13 | init 14 | } -------------------------------------------------------------------------------- /src/pages/www/packages/TestA/apis/index.js: -------------------------------------------------------------------------------- 1 | // export api here. recommend to use **custom** GM_xmlhttpRequest instead of fetch or native GM_xmlhttpRequest -------------------------------------------------------------------------------- /src/pages/www/packages/TestA/components/Count.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 11 | 12 | 35 | -------------------------------------------------------------------------------- /src/pages/www/packages/TestA/index.js: -------------------------------------------------------------------------------- 1 | import { TestA } from "./views"; 2 | import "./styles/index.css"; 3 | 4 | function init() { 5 | new TestA({ 6 | target: document.getElementById('u1') 7 | }) 8 | } 9 | 10 | export default { 11 | init 12 | } -------------------------------------------------------------------------------- /src/pages/www/packages/TestA/styles/index.css: -------------------------------------------------------------------------------- 1 | .custom-style { 2 | color: blue 3 | } -------------------------------------------------------------------------------- /src/pages/www/packages/TestA/views/TestA.svelte: -------------------------------------------------------------------------------- 1 | 49 | 50 | 111 | 112 | 113 |
114 | 115 | 120 | 121 | 122 |
123 |

todo

124 | {#each todos.filter(t => !t.done) as todo (todo.id)} 125 | 134 | {/each} 135 |
136 | 137 |
138 |

done

139 | {#each todos.filter(t => t.done) as todo (todo.id)} 140 | 149 | {/each} 150 |
151 | 152 |
-------------------------------------------------------------------------------- /src/pages/www/packages/TestA/views/index.js: -------------------------------------------------------------------------------- 1 | import TestA from "./TestA.svelte" 2 | export { 3 | TestA 4 | } -------------------------------------------------------------------------------- /src/pages/www/packages/index.js: -------------------------------------------------------------------------------- 1 | import TestA from "./TestA" 2 | function initPkg() { 3 | TestA.init(); 4 | } 5 | 6 | export { 7 | initPkg 8 | } -------------------------------------------------------------------------------- /src/router.js: -------------------------------------------------------------------------------- 1 | import pages from "./pages" 2 | 3 | function initRouter() { 4 | // 根据需求判断location对象的值,来选择使用哪个page 5 | if (location.href.indexOf("www") !== -1) { 6 | pages.www.init(); 7 | } 8 | } 9 | 10 | export { 11 | initRouter 12 | } -------------------------------------------------------------------------------- /src/utils/index.js: -------------------------------------------------------------------------------- 1 | // 公共 2 | export function getStrMiddle(str, before, after) { 3 | // 取中间文本 4 | let m = str.match(new RegExp(before + '(.*?)' + after)); 5 | return m ? m[1] : false; 6 | } -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import { svelte } from '@sveltejs/vite-plugin-svelte' 3 | import path from 'path' 4 | import fs from 'fs' 5 | // https://vitejs.dev/config/ 6 | 7 | const FILE_NAME = "main.user.js"; 8 | const headerText = fs.readFileSync("./src/header.js").toString() 9 | export default ({mode}) => { 10 | return defineConfig({ 11 | plugins: [ 12 | svelte(), 13 | header(headerText, mode==="dev") 14 | ], 15 | build: { 16 | outDir: "dist", 17 | cssCodeSplit: true, 18 | minify: false, 19 | lib: { 20 | entry: "src/main.js", 21 | formats: ["iife"], 22 | fileName: () => { 23 | return FILE_NAME; 24 | }, 25 | name: FILE_NAME 26 | }, 27 | watch: mode === "dev" 28 | } 29 | }) 30 | } 31 | 32 | function header(text, dev=true) { 33 | return { 34 | name: "vite-plugin-header", 35 | generateBundle(OutputOptions, ChunkInfo) { 36 | let filename = String(OutputOptions.name).replace("dist/", ""); 37 | let newCode = text + "\n" + ChunkInfo[filename].code; 38 | ChunkInfo[filename].code = newCode; 39 | if (dev) { 40 | let index = String(text).lastIndexOf("\n"); 41 | let newText = text.slice(0, index) + `\n// @require file:///${path.join(__dirname, "/dist/" + FILE_NAME)}` + text.slice(index); 42 | if (!fs.existsSync("dist")) { 43 | fs.mkdirSync("dist"); 44 | } 45 | fs.writeFileSync(path.join(__dirname, "/dist/" + FILE_NAME.replace(".js", ".dev.js")), newText); 46 | } 47 | } 48 | } 49 | } 50 | --------------------------------------------------------------------------------