利用wasm实现读写本地项目的在线编辑器

利用wasm实现读写本地项目的在线编辑器

本篇内容是通过AI-ChatGPT问答和查阅相关文档得到的答案。
起因是看到在线Vscode和RemixIde都实现了在线读取用户电脑文件夹作为项目根目录,达成读取、创建、修改、删除该目录下所有文件、文件夹的功能。
而在浏览器中因为安全性问题,光凭javascript本身是做不到这么完整的功能,最多只能读写单个文件,还不是无缝衔接和高兼容性。
其中后者是使用Nodejs开发了Remixd的浏览器插件来实现,而前者就是利用近年发展起来的wasm/wasi来实现的。
由于wasm/wasi更具有光明的前途,本文也是主要结合AI探索这项功能的基础实现方式。

  1. 创建一个新的Rust项目:
cargo new --lib wasm-example
cd wasm-example
  1. 在Cargo.toml文件中添加依赖项:
[lib]
crate-type = ["cdylib"][dependencies]
wasm-bindgen = "0.2"
  1. 创建一个名为lib.rs的文件,并添加以下代码:
use std::fs;
use wasm_bindgen::prelude::*;#[wasm_bindgen]
pub fn read_folder(folder_path: &str) -> Result<Vec<String>, JsValue> {let entries = fs::read_dir(folder_path).map_err(|err| JsValue::from_str(&format!("Error reading folder: {}", err)))?;let file_names: Vec<String> = entries.filter_map(|entry| {entry.ok().and_then(|e| e.file_name().into_string().ok())}).collect();Ok(file_names)
}#[wasm_bindgen]
pub fn write_file(file_path: &str, content: &str) -> Result<(), JsValue> {fs::write(file_path, content).map_err(|err| JsValue::from_str(&format!("Error writing file: {}", err)))?;Ok(())
}
  1. 在项目根目录下运行以下命令,将Rust代码编译为Wasm模块:
wasm-pack build --target web --out-name wasm --out-dir ./static
  1. 在前端HTML文件中引入生成的Wasm模块,并使用JavaScript与Wasm进行交互:

<body>
<input type="file" id="folderInput" webkitdirectory directory multiple>
<ul id="fileList"></ul><input type="text" id="fileNameInput" placeholder="文件名">
<textarea id="fileContentInput" placeholder="文件内容"></textarea>
<button id="writeButton">写入文件</button><script>import init, {read_folder, write_file} from './static/wasm.js';async function run() {await init();const folderInput = document.getElementById('folderInput');const fileListElement = document.getElementById('fileList');folderInput.addEventListener('change', async (event) => {const files = event.target.files;fileListElement.innerHTML = '';for (let i = 0; i < files.length; i++) {const file = files[i];const listItem = document.createElement('li');listItem.textContent = file.name;fileListElement.appendChild(listItem);const fileContent = await readFile(file);console.log(fileContent);}});const writeButton = document.getElementById('writeButton');writeButton.addEventListener('click', async () => {const fileName = document.getElementById('fileNameInput').value;const fileContent = document.getElementById('fileContentInput').value;await writeFile(fileName, fileContent);});}function readFile(file) {return new Promise((resolve, reject) => {const reader = new FileReader();reader.onload = (e) => {resolve(e.target.result);};reader.onerror = (e) => {reject(e.target.error);};reader.readAsText(file);});}async function writeFile(fileName, fileContent) {try {await write_file(fileName, fileContent);console.log('File written successfully');} catch (error) {console.error('Error writing file:', error);}}run();
</script>
</body>

你可以使用JavaScript中的File API来实现以编程方式触发文件夹选择的行为,而不是通过点击元素。

以下是一个示例代码,演示如何使用JavaScript创建一个元素,并通过点击标签来触发文件夹选择:


<body>
<a href="#" id="folderLink">选择文件夹</a>
<ul id="fileList"></ul>
<script>const folderLink = document.getElementById('folderLink');const fileListElement = document.getElementById('fileList');folderLink.addEventListener('click', (event) => {event.preventDefault();const folderInput = document.createElement('input');folderInput.type = 'file';folderInput.webkitdirectory = true;folderInput.directory = true;folderInput.multiple = true;folderInput.addEventListener('change', (event) => {const files = event.target.files;fileListElement.innerHTML = '';for (let i = 0; i < files.length; i++) {const file = files[i];const listItem = document.createElement('li');listItem.textContent = file.name;fileListElement.appendChild(listItem);}});folderInput.click();});
</script>
</body>

当用户选择文件夹后,会触发change事件,我们可以在事件处理程序中获取选择的文件列表,并将文件名显示在页面上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/128297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫利用代理IP分析大数据

目录 前言 一、什么是代理IP&#xff1f; 二、为什么需要使用代理IP&#xff1f; 1.突破访问限制 2.提高访问速度 3.保护隐私 三、代理IP的分类 1.高匿代理IP 2.普通代理IP 3.透明代理IP 四、如何获取代理IP&#xff1f; 1.免费代理IP网站 2.付费代理IP服务商 五…

Java文件操作详解

CONTENTS 1. 文件和目录路径1.1 获取Path的片段1.2 获取Path信息1.3 添加或删除路径片段 2. 文件系统3. 查找文件4. 读写文件 1. 文件和目录路径 Path 对象代表的是一个文件或目录的路径&#xff0c;它是在不同的操作系统和文件系统之上的抽象。它的目的是&#xff0c;在构建路…

UTF-8-SIG 和 UTF-8 with BOM 有什么区别,该怎么选

前言 用 Sublime Text 打开一个文件&#xff0c;出现一个框框&#xff0c;提示要点选UTF-8-SIG(100%) 或 UTF-8 with BOM 详解 BOM (Byte Order Mark) 存在&#xff1a;UTF-8 with BOM 包含一个特殊的字节顺序标记 (BOM)&#xff0c;它是一个非打印字符&#xff0c;通常用于…

前端基础之CSS

目录 一、CSS介绍 CSS语法 CSS注释 CSS的几种引入方式 二、CSS选择器 基本选择器 组合选择器 属性选择器 分组和嵌套选择器 伪类选择器 伪元素选择器 选择器的优先级 三、CSS属性相关 宽和高 字体属性 文字属性 背景属性 边框 border-radius display属性 …

常见接口测试面试题

1、按你的理解&#xff0c;软件接口是什么&#xff1f; 答&#xff1a; 就是指程序中具体负责在不同模块之间传输或接受数据的并做处理的类或者函数。 2、HTTP和HTTPS协议区别&#xff1f; 答&#xff1a; https协议需要到CA&#xff08;Certificate Authority&#xff0c;证书…

物联网整体框架有哪些层面?

物联网是当前非常火热的话题&#xff0c;各个行业对物联网的关注和投入力度也很大&#xff0c;一些互联网巨头都在紧锣密鼓的布局物联网产业&#xff0c;抢占市场先机。 物联网的整体构架大致可以分为以下四个层面&#xff1a; 1.感知识别层 感知层是物联网整体架构的基础&…

HTML标题、段落、文本格式化

HTML标题&#xff1a; 在HTML文档中&#xff0c;标题是很重要的。标题是通过<h1> - <h6标签进行定义的&#xff0c;<h1> 定义最大的标题&#xff1b;<h6>定义最小的标题。 <hr> 标签在HTML页面中用于创建水平线&#xff0c;hr元素可用于分隔内容。…

【Linux】Nginx安装使用负载均衡及动静分离(前后端项目部署),前端项目打包

一、Nginx导言 1、引言 Nginx 是一款高性能的 Web 服务器和反向代理服务器&#xff0c;也可以充当负载均衡器、HTTP 缓存和安全防护设备。它的特点是内存占用小、稳定性高、并发性强、易于扩展&#xff0c;因此在互联网领域得到了广泛的使用。 总结出以下三点: 负载均衡&#x…

CN考研真题知识点二轮归纳(4)

持续更新&#xff0c;上期目录&#xff1a; CN考研真题知识点二轮归纳&#xff08;4&#xff09;https://blog.csdn.net/jsl123x/article/details/134135134?spm1001.2014.3001.5501 1.既可以扩展网段又是二层的设备 网段一般指一个计算机网络中使用同一物理层设备&#xff…

小程序如何设置自动使用物流账号发货

小程序支持自动使用物流账号发货并生成运单号。商家需要与物流公司合作&#xff0c;获取物流账号&#xff0c;支持快递物流和同城外卖配送平台。具体方法请参考公众号之前发布的文章&#xff0c;例如可以搜索“快递账号”。 导入物流账号后&#xff0c;在小程序管理员后台->…

出海营销必看:如何避免邮件被识别为垃圾邮件

对于现在的商业环境来说&#xff0c;邮件通信已经成为企业与客户、合作伙伴以及员工之间沟通和交流的重要方式。然而&#xff0c;尽管企业发送的邮件通常都是正常的、合规的&#xff0c;有时候却会被系统错误地标记为营销邮件。这个情况给企业带来了很多困扰。 如果企业的邮件…

如何使用内网穿透远程访问Linux SVN服务?

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

docker fixuid

docker fixuid 一、fixuid是什么二、使用场景三、问题dockerfiledocker run 一、fixuid是什么 fixuid是用go语言编写的&#xff0c;当容器起来后可以修改容器中非root用户的UID/GID和文件权限。 项目地址&#xff1a;https://github.com/boxboat/fixuid 二、使用场景 当容器…

Python嵌入式数据库 / 轻量级数据库 / 小型数据库介绍(SQLite、Pandas DataFrame、TinyDB)(python数据库)

文章目录 Python嵌入式数据库/轻量级数据库介绍什么是嵌入式数据库/轻量级数据库&#xff1f;SQLitePandasTinyDB总结 Python嵌入式数据库/轻量级数据库介绍 在构建应用程序时&#xff0c;数据存储是必不可少的一部分。传统的方式是使用如MySQL、PostgreSQL这样的重量级数据库…

使用vue3+vite+elctron构建小项目介绍Electron进程间通信

进程间通信 (IPC) 是在 Electron 中构建功能丰富的桌面应用程序的关键部分之一。 由于主进程和渲染器进程在 Electron 的进程模型具有不同的职责&#xff0c;因此 IPC 是执行许多常见任务的唯一方法&#xff0c;例如从 UI 调用原生 API 或从原生菜单触发 Web 内容的更改。 在 …

[题] 查找最大元素 #字符输入

相关笔记汇总&#xff1a;[笔记] 字符串输入 #字符输入 题目 题目&#xff1a;1381 查找最大元素 对于输入的每个字符串&#xff0c;查找其中的最大字母&#xff08;ASCII码最大&#xff09;&#xff0c;在该字母后面插入字符串“(max)”。 输入 输入数据包括多个测试实例&…

input 调起键盘 ,键盘距离输入框底部太近

input 调起键盘 &#xff0c;键盘距离输入框底部太近 解决方法 cursorSpacing‘20’ 单位是 ‘px’ <input cursorSpacing20 type"text" v-model"replyMain" />距离底部距离 20px &#xff0c;输入框距离键盘距离是20px

centos7 配置搭建 wordpress 博客

环境配置 系统:centos7 CPU:2核 内存:4G 硬盘:40G 一、登录云服务器器 1.单击实例--实例名称 2. 选择安全组页签,单击安全组操作列的管理规则, 3.在入方向添加需要放行的端口。本教程中,在安全组入方向放行SSH默认22端口、Apache默认80端口 4.登录服务器 5.更改主…

oracle如果不适用toad或者plsql工具如何获取索引建表语句

select dbms_lob.substr(dbms_metadata.get_ddl(INDEX,INDEX_NAME,DIXON))||; from dba_indexes where ownerDIXON这个语句可以获取dixon用户的所有索引创建语句&#xff0c;sql脚本形式呈现 点开一个语句查看 如果不使用dbms_lob.substr这个函数最后得到是一个clob selec…

cartographer,ros,路径规划近两年的工作笔记

马上转入cartographer的去ros移植了,随便记录一下研究cartographer和ros这些天来的摸鱼笔记吧虽然很多人对用ros做产品嗤之以鼻,但是我个人是不排斥的,对代码能力有限的人群来说这是产品化最快的方式! 敝帚自珍~~~继续加油~~~ 建图总结 odom 尤其是转弯的时候,存在累积误…