本章精髓 数据存在哪里,决定了这个应用能做到什么程度。写死在页面里,谁打开都一样;存进浏览器,只在这台机器上;要让所有人共用一份,靠双击打开的本地文件是做不到的。
学完本章后,你应该能够:
- 先画字段表再动手,说清一条记录由哪几个字段构成、各是什么类型;
- 做出增、删、改、查四种操作齐全的小工具,并设计好一条都没有时的样子;
- 在开发者工具里找到自己的数据,并说出它在硬盘上以什么形式存在;
- 说清本地存储的四条脾气:真实存在、位置由浏览器定、明文没加密、跟着浏览器走;
- 判断一个需求要落在三层存储的哪一层,并解释为什么这一版到不了第三层。
成品 · 字段表 · 先要中间产物
这张表花五分钟,能省下后面两轮返工。
1.1本章成品:《这个月我花了多少》
记一笔支出:金额、分类、备注。列表显示,底部实时汇总。关掉浏览器再打开,记录还在。
打开 第07章演示_记账本.html 试一次,再打开 第07章演示_没存下来.html 试一次。两个页面长得一模一样,操作也一样,区别只在刷新之后:前者记录还在,后者一条不剩。这一章要补上的就是这个差别。
1.2字段表:一条记录长什么样
动手之前先回答一个问题:一条记录由哪几个字段构成,每个字段是什么类型,哪些必填。这张表定错,后面每加一个功能都要返工。
1.3本章新技巧:先要中间产物,再要成品
直接要成品,你只能在做完之后才发现字段设计错了。让它先交一张字段表,你确认了再往下走。
这个做法在往后每一次涉及数据的任务里都用得上:先要那份能一眼看懂、改起来只要一行字的中间产物,确认之后再要那份改起来要动一整页的成品。
1.4可直接复制的提示词
1.5大模型的常见偏差
第07章演示_记账本.html;对照实验用 第07章演示_没存下来.html,三层存储用 第07章演示_存储三层.html。三个文件都是现成的。
字段 · 编号 · 增删改查 · 空状态 · 本地存储
本章的核心内容集中在这一部分和下一部分。
这八个术语会原样出现在浏览器面板、技术文档与产品说明中。前五个在本部分讲解,后三个在第三、四部分讲解。
2.1五个知识点,一个一个看
一行是一条记录,一列是一个字段
现象:列表里每一行长得一模一样,只是里面的字不同。
概念:一件事记一次,叫一条记录;记录里的每一项,叫一个字段。字段要先定好:有哪几个、各是什么类型、哪些必填。字段一改,界面、存储、列表、汇总都要跟着改。
类比:花名册。一行是一个人,姓名、学号、班级是三列。
编号跟着记录走,行号跟着排序走
现象:记两条一模一样的支出,删掉第二条,结果不见的是第一条。
概念:每条记录都要有一个别人没有的编号,叫唯一标识(id),由程序生成,不给人填。删除和修改都按编号定位。按第几行定位的程序,列表一排序就会动错那一条。
类比:点名按学号,不按站在第几排。队伍一动,排数就变了。
四件事凑齐,这个工具才算能用
现象:记完一笔发现金额填错了,页面上却找不到能改的地方。
概念:对数据的操作只有四种:增、删、改、查,合称增删改查(CRUD)。这四个字母在数据库、后台系统、接口文档里到处出现。它默认给足的常常只有增和查,另外两种要逐个点名。
类比:账本上添一笔、划掉一笔、改一笔、翻回去看一笔。
第一次打开看到的就是这一屏
现象:刚做好的记账本第一次打开,中间一片空白,什么也没有。
概念:数据为零时的界面叫空状态。它是必须设计的一种状态,而不是"还没做完"的样子。空状态要写清两件事:现在没有东西,以及下一步该点哪里。
类比:空购物车不会只留一片白,它会写一句"去逛逛"。
这就是"存下来了"的意思
现象:关掉浏览器第二天打开,记的账还在。
概念:本地存储(localStorage)是浏览器给每个来源留的一格抽屉,存的是文字,关掉浏览器也不会丢。存进去要先打包成一段文字,取出来再还原。它只在这台机器的这个浏览器里,换一台电脑就是空的。
类比:浏览器给每个网站开的一个抽屉,抽屉钉在这台电脑上。换台电脑刷视频要重新登录,同一个道理。
2.2这就是存和取的那几行
整页一百多行,真正跟"存"有关的只有这几行。存进去要先打包成文字,取出来要还原成记录。
// 抽屉里的格子名。起一个别人不会重名的名字,这一行不是随手写的
var KEY = 'myExpense2026';
// 取:从抽屉里拿出那段文字,还原成一串记录;第一次打开时是空的
function load() {
var s = localStorage.getItem(KEY);
return s ? JSON.parse(s) : []; // 没有就给一个空清单,不要让它崩
}
// 存:把一串记录打包成文字,放回抽屉
function save(list) {
localStorage.setItem(KEY, JSON.stringify(list));
}
// 增:生成一个唯一编号,插到最前面
function add(amount, cat, note) {
var list = load();
list.unshift({ id: Date.now(), amount: amount, cat: cat, note: note, time: nowText() });
save(list); render();
}
// 删:按编号筛掉那一条,不是按第几行
function del(id) {
var list = load().filter(function (r) { return r.id !== id; });
save(list); render();
}
开发者工具 · 硬盘上的文件 · 明文
"存在浏览器里"这句话很虚。这一部分把它变成看得见的东西。
3.1办法一:按 F12,用浏览器自带的面板看
在记账本页面上按 F12,找到顶上那排标签里的应用(英文界面是 Application),左侧展开本地存储空间,点进去,右边就是一张两列的表。
左边那一列的名字,就是代码里 KEY 那个变量的值。所以两个作品各占一格,互不干扰。右边那一列,就是打包之后的那段文字,原样躺在这里。
3.2办法二:到硬盘上把那个文件找出来
浏览器不是把数据变没了,它落在一个真实存在的文件夹里。以 Windows 为例,把"你的用户名"换成自己的:
两个浏览器的路径只差中间那一段厂商名。这一眼就能看懂什么叫存储隔离:它们压根就是两个文件夹。
AppData 默认是隐藏的,不用去改系统设置:把上面那行路径复制进文件资源管理器的地址栏,回车就能进去。
进去之后看到的是一堆名叫 000005.log、CURRENT、LOCK、MANIFEST 的文件,没有一个叫"我的记账本"。这里存的不是一人一份的文档,而是一个数据库,你在这个浏览器里打开过的所有页面,存的东西全在这几个文件里混着。
用记事本打开最大的那个 .log 文件,会看到一片乱码里夹着能读的字:myExpense2026、金额、分类、备注。那几段就是你的数据。
3.3另外两个知识点
前两条是隔离,第三条是不隔离
现象:同一个作品,在另一个浏览器里打开是空的。而同一台电脑上两个不同的作品,数据却会互相覆盖。
概念:抽屉按来源分格:不同浏览器各一套,不同网站各一格。但所有双击打开的本地文件共用 file:// 这一格,靠键名互相区分,不靠文件名。
类比:两家银行各有各的保险库,而同一个库里的格子只靠编号区分,谁的编号重了谁倒霉。
乱码里夹着能读的字,那几段就是你的数据
现象:用记事本打开那个 .log 文件,能直接读出自己记的金额和备注。
概念:本地存储的数据是明文保存的,没有加密。方便和不安全是同一件事的两面。凡是不愿意被别人看到的内容,不要交给它。
类比:写在便签上贴在桌面,随手可取,也随眼可见。
3.4三个紧接着会冒出来的问题
想让数据也过去,正路只有一条:让应用自己把数据吐出来,变成一份你拿得动的文件,发过去,对方用导入功能读进他自己的抽屉。真实世界里的本地工具,笔记软件、密码管理器、单机游戏存档,走的全是这条路。上机的选做就是加这个功能。
写死 · 本机 · 服务器
你的需求要落在哪一层,决定了这件事做不做得成。
4.1数据可以存在三个地方
打开 第07章演示_存储三层.html,选一种存法,再选一种情境,页面会告诉你数据还在不在。三种存法的脾气,一次就试完了。
第三层这一版到不了。你在你的浏览器里记,我在我的浏览器里记,两边之间没有任何通道。这条边界不是缺陷:单人用的工具,第二层足够。
4.2第八个知识点
两个人之间要有一个共同的中转站
现象:手机上的外卖软件,打开要联网,换个手机登录后订单还在。
概念:你看得见、点得到的那一部分叫前端;替所有人保管数据、处理请求的那一部分叫后端,跑在一台全天开机、有固定地址的计算机上,那台机器叫服务器。多人共用一份数据,必须经过这个中转站。
类比:各自的抽屉,和教室前面那块公共黑板。要让全班都看到,只能写在黑板上。
怎么判断一个软件的数据在第几层,有三个现象可以看:打开要不要联网、提交要不要联网、换台设备登录数据还在不在。三个都是要,那它的数据在服务器上,不在你的手机里。
4.3前沿三分钟:数据存在哪里,是一道选择题
这几年有一类做法重新流行起来,叫"本地优先":数据首先存在使用者自己的设备上,联网只用来同步,断网照样能用。笔记软件、待办工具、白板应用里都能看到这条路线。
它对着的是另一种默认做法:数据全部放在服务商的服务器上,断网就打不开,服务停了数据也就跟着没了。本地优先的主张很简单:你的东西应当先在你手上。
两条路各有代价,本地优先换来断网可用与数据自持,代价是多设备同步要自己想办法。所以"数据存在哪里"不是技术高低,而是一道选择题:你做的东西,给一个人用,还是给一群人用。
三选一 · 字段表 · 四种操作
上机环节由此开始,本次上机的成果就是作业 2,当堂完成并提交。
5.1三个题目,任选其一
个人记账:金额、分类、备注,列表加实时汇总。
通用书名、进度、短评、评分,列表加已读本数统计。
偏文科批次号、条件、结果、备注,列表加按条件筛选。
偏理工三个题目都要求增删改查四种操作齐全、有空状态、关掉浏览器再打开数据还在。允许更换题材,验收标准不变。
5.2上机六步
5.3共同验收标准
5.4常见错误与处理
5.5提交内容
提交方式:按教师提供的作业模板(Word)填写,文档开头注明所选题目。提交渠道见课堂通知。当堂提交。
5.6再进一步(选做)
给你的工具加一对导出与导入:导出把当前所有记录变成一段文字或一个文件,导入把它读回来。
加完之后,把导出的那段东西发给同组同学,让他在自己的电脑上导入。这是本地存储唯一的正路:数据不会自己跟着作品走,要让应用把它吐出来,你才拿得动。
- 先定字段表,再动手。一条记录有哪几个字段、各是什么类型、哪些必填。填得出三条示例数据,这张表就出来了。
- 对数据的操作只有四件事:增、删、改、查。它默认给足的常常只有增和查,另外两种要逐个点名;删和改一律按编号定位,不按第几行。
- 空状态是必须设计的一种状态。一条记录都没有的时候,要写清现在没有东西,以及下一步该点哪里。
- 本地存储的脾气有四条:硬盘上真实存在、位置由浏览器说了算、明文没有加密、跟着浏览器而不跟着你的文件。
- 数据存在哪里,决定这个应用能做到什么程度。要让所有人共用一份,必须有一台服务器当中转站,这一版到不了那一层。