首页 > 其他分享 >VSCode Webview 插件开发的模板的踩坑记录

VSCode Webview 插件开发的模板的踩坑记录

时间:2024-09-04 18:52:34浏览次数:14  
标签:index 插件 src VSCode js build webview Webview 打包

问题

CSP: refused xxxxxx

常见的几类报错(打开开发者工具,在控制台就会自动输出)

  • refused to apply inline style because it violates the following Content Security Policy directive xxxxxx
  • refused to load the script '' because it violates the following Content Security Policy directiv

VSCode webview 对于资源的注入很严格!!

目前的策略是把 web 站点打包成一个index.js和 index.css去注入!

资源链接必须转换成 vscode 允许的资源格式!!!


typescript

代码解读

复制代码

//path: src/panels/VueBoilerplatePanel.ts private _getWebviewContent(webview: Webview, extensionUri: Uri) { // The CSS file from the Vue build output const stylesUri = getUri(webview, extensionUri, ["webview-ui", "build", "assets", "index.css"]); // The JS file from the Vue build output const scriptUri = getUri(webview, extensionUri, ["webview-ui", "build", "assets", "index.js"]); const nonce = getNonce(); // Tip: Install the es6-string-html VS Code extension to enable code highlighting below return /*html*/ ` <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="Content-Security-Policy" content="default-src 'none';connect-src https:; style-src ${webview.cspSource} 'unsafe-inline'; img-src ${webview.cspSource} https: data:; script-src 'nonce-${nonce}';"> <link rel="stylesheet" crossorigin nonce="${nonce}" type="text/css" href="${stylesUri}"> <script type="module" nonce="${nonce}" src="${scriptUri}"></script> <title>Hello World</title> </head> <body> <div id="app"></div> </body> </html> `; }

  1. meta的 csp 策略进行了修改,允许加载部分资源,而不是默认各种卡死,对 web 开发友好
  2. index.htmlscriptlink 标签的 srchref 都进行了转换,还有 hash 防缓存

上面的 csp 设置值的简单介绍

施加策略的目录允许潜在的源列表描述
default-src'none'默认情况下,禁止所有资源类型的加载。
connect-srchttps:仅允许通过 https 协议进行 XMLHttpRequest,Fetch 加载资源等操作。
style-src${webview.cspSource} 'unsafe-inline'允许从 webview.cspSource 和内联样式加载样式。
img-src${webview.cspSource} https: data:允许从 webview.cspSource、https 协议和 data 协议(即base64 编码的图片)加载图片。
script-src'nonce-${nonce}'仅允许加载具有特定 nonce 值的脚本。

如何打包所有文件到一个index.js 和 index.css

  • css和js需要打包成单独文件

typescript

代码解读

复制代码

// path: webview-ui/vite.config.ts build: { modulePreload: false, // 关闭预加载 outDir: "build", // 打包输出目录 emptyOutDir: true, // 打包之前清空build 文件夹 assetsInlineLimit: 99999999999, // 默认是4096 rollupOptions: { output: { entryFileNames: `assets/[name].js`, // 打包后的入口文件 chunkFileNames: `assets/[name].js`, assetFileNames: `assets/[name].[ext]`, manualChunks: (id: string) => { // 打包后的静态资源,自定义策略,全部合并到 index return 'index' } }, }, },

  • png这类静态图片直接打包成base64(参考上面的 assetsInlineLimit)

  • svg 用 vite-svg-loader, 默认转换为 Component


typescript

代码解读

复制代码

// path: webview-ui/vite.config.ts svgLoader({ defaultImport: 'component' }), // 在使用层面可以通过 query(?) 来转换 svg 为内联或者其他 // 具体可以去看这个插件的介绍,挺强大的

路由模式

因为内嵌 webview 不像浏览器有路由导航栏这些,一般 webview 没有前进后退的概念,这种我们的路由跳转优先采用内存路由(memory router), 它非常适合需要完全控制历史堆栈的场景, 类似 Vue 或者 React 都有提供!!

开发模式 dev

从项目结构上来看,里面就是两个工程,所以要运行两条命令;

  • 一条是打包 webview 网站输出静态资源
  • 一条是编译插件源码输出插件入口文件

那有什么可以同时运行并输出信息的呢? 我用concurrently来解决了我的这个困扰。

webview的 debug

基本绝大多数异常都是在开发者工具里面的控制台看,vscode 本身就是基于 electron 搞的,内核 chromium。 做了一些系统交互接口和更加严格的资源策略模式,类似各种沙盒机制!!但本质上还是“浏览器”!!

仓库

开源项目名称vscode-webview-vite-vue-boilerplate
开源项目地址github.com/crper/vscod…
Demo视频www.yuque.com/crper/blog/…

tips: webview-ui(仓库内)

这是一个基于Vite 5 + Vue3 + TypeScript + UnoCSS + Vue Router + Pinia + Naive UI的项目模板,相关的初始化和配置都有,“五脏俱全”,算是一个 mvp demo 项目,有兴趣的可以看看瞅瞅。

原文链接:https://juejin.cn/post/7357554457914130467

标签:index,插件,src,VSCode,js,build,webview,Webview,打包
From: https://blog.csdn.net/weixin_47588164/article/details/141896033

相关文章

  • 子比主题美化 – 自助售卡/发卡插件 源码 | WordPress插件,完美支持
    插件功能支持自由添加卡密支持查看卡密库存邮箱自动发送卡密信息后台卡密库存不足提醒如何使用:在后台新建一篇文章,然后选择自动售卡。设置相关价格(不支持将价格设置为0)。移动到已编辑文章的底部(添加密码信息)直接发布文章以显示文章销售卡。安装方法:在Wordpress后......
  • 推荐一款:简单、易懂、功能强大的Vue3可拖拽插件
    第一步:安装npm使用以下命令安装npminstallvue-grid-layout--saveyarn使用以下命令安装yarnaddvue-grid-layout第二步:配置全局变量import{createApp}from'vue'importAppfrom'./App.vue'importVueGridLayoutfrom'vue-grid-layout'//引入layout......
  • ‌AI带货直播插件:功能与实现‌!
    随着人工智能技术的飞速发展,AI带货直播插件已成为电商领域的新宠,这类插件通过集成先进的人工智能技术,不仅提升了直播的效率和互动性,还大大增强了用户体验和转化率,本文将详细介绍AI带货直播插件的主要功能,并分享七段关键源代码。一、AI带货直播插件的主要功能1、自动播放与内容生成(......
  • vscode 找不到 NETFramework,Version=v4.7.1 报错,简单解决办法
    当我们用vscode开发时,会发现有这样的报错:Thereferenceassembliesforframework“.NETFramework,Version=v4.7.1”werenotfound.Toresolvethis,installtheSDKorTargetingPackforthisframeworkversionorretargetyourapplicationtoaversionofthef......
  • VScode+STM32开发环境搭建
    VScode+STM32的开发环境搭建前言使用VScode开发STM32主要是因以下几个原因:1、经济受限:keil5需要收费啊;2、有VScode开发相关经验。开发环境搭建软件开发环境的搭建主要用到STM32CubeMX和VisualStudioCode两大软件;安装的步骤按正常的安装流程来即可。下载地址:STM3......
  • Chrome 浏览器插件获取网页 window 对象(方案二)
    前言最近有个需求,是在浏览器插件中获取window对象下的某个数据,当时觉得很简单,和document一样,直接通过嵌入content_scripts直接获取,然后使用sendMessage发送数据到插件就行了,结果发现不是这样滴...在这里不推荐使用runtime.executeScript进行注入,很可能会报错:Refus......
  • 【推荐100个unity插件之32】对中文支持很好的unity插件,集新手引导、本地化多语言、红
    文章目录前言条件官网下载资源安装设置unityinput选项生成配置文件功能1、新手引导文档效果2、本地化多语言功能文档效果3、红点功能文档效果4、刘海屏适配文档效果6、可视化层级管理工具文档效果7、其他完结前言ThunderFireUXTool由网易雷火UX用户体验中......
  • Chrome 浏览器插件获取网页 window 对象(方案一)
    前言最近有个需求,是在浏览器插件中获取window对象下的某个数据,当时觉得很简单,和document一样,直接通过嵌入content_scripts直接获取,然后使用sendMessage发送数据到插件就行了,结果发现不是这样滴...这玩意还是个挺麻烦的点,下面给出三种解决方案在这里不推荐使用runtime......
  • Android Gradle 插件的说明
    1、前天运行好好的项目,今天运行就报错:这个意思是Gradle版本低了这个意思是Gradleplugin(8.5.1)最高的compileSdk=34,用了35,就不对,因为一开始我们安装的就是35的版本,我们可以安装下34,然后用34就可以了。2、GradlePlugin这是一种写法,我们也可以这样,用alias,用一个文件......
  • 『SD』Stable Diffusion WebUI 安装插件(以汉化为例)
    本文简介点赞+关注+收藏=学会了StableDiffusionWebUI是允许用户自行安装插件的,插件的种类有很多,有将页面翻译成中文的插件,也有提示词补全插件,也有精细控制出图的插件。以汉化为例,StableDiffusionWebUI默认是英文的,我们只需装个汉化插件然后重启一下项目就能......