网站首页 > 技术文章 正文
前言
周末逛github的时候,发现我们只需要在github域名上加上1s他就能够打开一个vscode窗口来阅读代码,比起在github仓库中查看更加方便
然后我就想网页端vscode能不能打开我本地的项目呢,带着这个疑惑我打开了网页版vscode,它居然真的可以打开我本地的项目代码!
难道又出了新的API让前端的能力更进一步了?打开MDN查了一下相关文档,发现了几个新的API
showOpenFilePicker
用来选择文件
语法
showOpenFilePicker()
参数
- options:(可选)包含以下属性 multiple:布尔值,默认为false。为true表示允许用户选择多个文件 excludeAcceptAllOption:布尔值,默认为false。默认情况下,文件选择器带有一个允许用户选择所有类型文件的过滤选项(展开于文件类型选项中)。设置此选项为 true 以使该过滤选项不可用。 types:表示允许选择的文件类型的数组
返回值
返回一个promise对象,会兑现一个包含 FileSystemFileHandle 对象的 Array 数组。
体验
<template>
<div class="open_file" @click="openFile">打开文件</div>
</template>
<script setup lang="ts">
const openFile = async () => {
const res = await window.showOpenFilePicker();
console.log(res);
};
</script>
默认只能打开一个文件,可以传入multiple:true打开多个文件
showDirectoryPicker
用来选择目录
语法
属于浏览器全局方法,直接调用即可
showDirectoryPicker()
参数
- options:(可选)包含以下属性 multiple:布尔值,默认为false。为true表示允许用户选择多个文件 excludeAcceptAllOption:布尔值,默认为false。默认情况下,文件选择器带有一个允许用户选择所有类型文件的过滤选项(展开于文件类型选项中)。设置此选项为 true 以使该过滤选项不可用。 types:表示允许选择的文件类型的数组
返回值
返回一个promise对象,会兑现一个包含 FileSystemFileHandle 对象的 Array 数组。
体验
<template>
<div class="open_file" @click="openFile">打开文件</div>
<div class="open_file" @click="openDir">打开文件夹</div>
</template>
<script setup lang="ts">
const openFile = async () => {
const res = await window.showOpenFilePicker({
// multiple: true,
});
console.log(res.length);
};
const openDir = async () => {
const res = await window.showDirectoryPicker();
console.log(res);
};
</script>
扩展
FileSystemFileHandle
FileSystemFileHandle提供了一些方法可以用来获取和操作文件
- getFile:返回一个Promise对象,用于获取文件;
- createSyncAccessHandle:返回一个FileSystemSyncAccessHandle对象,用于同步访问文件;
- createWritable:返回一个Promise对象,用于创建一个可写流,用于写入文件;
FileSystemDirectoryHandle
FileSystemDirectoryHandle对象是一个代表文件系统中的目录的对象,它同样提供了方法来获取和操作目录
- entries:返回一个AsyncIterable对象,用于获取目录中的所有文件和目录;
- keys:返回一个AsyncIterable对象,用于获取目录中的所有文件和目录的名称;
- values:返回一个AsyncIterable对象,用于获取目录中的所有文件和目录的FileSystemHandle对象;
- getFileHandle:返回一个Promise对象,用于获取目录中的文件;
- getDirectoryHandle:返回一个Promise对象,用于获取目录中的目录;
- removeEntry:返回一个Promise对象,用于删除目录中的文件或目录;
- resolve:返回一个Promise对象,用于获取目录中的文件或目录;
entries、keys、values这三个方法都是用来获取目录中的所有文件和目录的,它们返回的都是一个AsyncIterable对象,我们可以通过for await...of语法来遍历它。
开发编辑器
了解完这些知识点,我们就可以来开发一个简陋网页版编辑器了,初期只包含打开文件、打开文件夹、查看文件、切换文件
编辑器大概长这样:
打开文件夹
const openDir = async () => {
const res = await window.showDirectoryPicker({});
const detalAction = async (obj: any) => {
if (obj.entries) {
const dirs = obj.entries();
for await (const entry of dirs) {
if (entry[1].entries) {
// 文件夹,递归处理
detalAction(entry[1]);
} else {
// 文件
fileList.value.push({
name: entry[0],
path: obj.name,
fileHandle: entry[1],
});
}
}
}
};
await detalAction(res);
showCode(fileList.value[0], 0);
console.log("--fileList--", fileList);
};
这里主要是递归处理文件夹,返回一个文件列表
读取文件内容
const showCode = async (item: any, index: number) => {
const file = await item.fileHandle.getFile();
const text = await file.text();
codeText.value = text;
currentIndex.value = index;
};
展示文件内容
使用highlight.js来高亮展示代码
<div class="show_code">
<pre v-highlight>
<code class="lang-dart">
{{ codeText }}
</code>
</pre>
</div>
最终效果如下:
想不到吧,这种功能现在纯前端就能够实现了,当然还可以做的更复杂一点,包括修改保存等功能,保存可以使用showSaveFilePickerAPI,它可以写入文件,同样是返回一个promise。感兴趣的可以试着完善编辑器的功能。
原文链接:https://juejin.cn/post/7277045020423045176
猜你喜欢
- 2024-12-17 起底scada系统界面,它真的是工业4.0的必需品。
- 2024-12-17 设备管理系统这样设计,简直是通往制造业第一梯队的捷径
- 2024-12-17 OA系统一定会借助AI东风大发展,界面颜值可不能拖后腿。
- 2024-12-17 只有海外的B端管理系统界面,可以这么大胆的设计
- 2024-12-17 OA后台操作系统能打磨成这样,真的佩服
- 2024-12-17 OA、ERP等管理操作系统的UI设计好了,员工的效率都能翻倍
- 2024-12-17 从零打造一款精美的基于Nextjs+antd5.0的中后台管理系统
- 2024-12-17 基于C#的工控系统,操作起来就是很丝滑
- 2024-12-17 敢问B端系统设计路在何方?颜值高、体验优是必选项。
- 2024-12-17 差距在哪?一文看懂特斯拉Model3、小鹏P7、理想ONE的热管理技术
你 发表评论:
欢迎- 518℃Oracle分析函数之Lag和Lead()使用
- 517℃几个Oracle空值处理函数 oracle处理null值的函数
- 510℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 502℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 496℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 488℃【数据统计分析】详解Oracle分组函数之CUBE
- 469℃Oracle有哪些常见的函数? oracle中常用的函数
- 466℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端富文本编辑器 (47)
- 前端路由 (61)
- 前端数组 (73)
- 前端排序 (47)
- 前端定时器 (47)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)