本文翻译自:
https://dev.to/olpeh/javascript-should-be-your-last-resort-5dje

在进行现代化Web前端开发时,使用着自己最爱的框架,有时候可能会情不自禁地用JavaScript解决所有的问题。很多时候这是无意识的,因为你日复一日的开发工作使用的正是JS。

这类似于亚伯拉罕·马斯洛(Abraham Maslow)在1966年描述的情况:

如果你仅有的工具是锤子,那么你就会不自禁地把所有东西都当作钉子。

——维基百科:Law of the instrument

图片来自Unsplash,作者FaustoMarqués

注意:在这篇文章中,我只谈论JS,尽管我在项目中使用的主要是TS——但最终,在编译后,都变成了JS。

实现UI时要考虑的因素

在所有情况下都使用JS的这种思维方式会产生不必要的处理负担,这些额外的JS操作都需要在最终用户的设备上运行。网站上的所有JS资源都需要通过网络浏览器下载、解析和执行。这通常是导致低端移动设备上的网站速度变慢和无响应,或使得网络速度变慢的原因。

那么我们应该如何走出思维困局:

  1. 是否可以用HTML完成?
  2. 如果不能,那么用HTML + CSS可以解决吗?
  3. 如果其他都没有效果,那么解决方案除了HTML和CSS之外,可能需要少量的JS。

这种思维方式对开发人员来说并不是一件易如反掌的事。可能你是一个关注JavaScript的前端开发人员,那么用这种方式解决大多数问题对你来说像呼吸一样自然。但是,你还得考虑你的最终用户。当涉及到Web性能时,客户端JS作为最大的问题一骑绝尘。

1. 是否可以用HTML完成?

计划和实现功能的基本结构和语义,先考虑是否可以使用纯HTML,而无需任何额外的样式和使用本机HTML元素和功能。如果需要一些其他样式或功能,则转到步骤2。

2.尝试使用HTML + CSS解决

使用CSS来应用所需的其他样式或动画,同时在脑海中谨记语义和可访问性。如果你要构建的特定UI片段中需要有一些额外的互动,则转到步骤3。

3.使用HTML + CSS + JS

添加满足要求所需的最少JS代码量。请记住,如果不用JS就可以解决问题,那么就应该不要用到JS。

完成后,向同事展示代码,让他们进行审核。这样的话,如果代码中还有些不必要的部分,那么就可以解决这些问题而不给用户增加客户端JS成本。

举个简单的例子

所举的这个例子,发生于Web前端开发中的几乎所有部分,但此处是一个简单的示例,用来证明我的观点。

假设你正在开发一个React项目,而你正在开发的功能具有一些UI部件,这些UI部件只有在一定的延迟(例如2秒)之后才可见。

使用React Hooks

如果你习惯于使用React和Hooks解决问题,那么最初的解决方案可能是这样的:

const [thingVisible, setThingVisible] = useState(false);

useEffect(() => {
const timeoutId = setTimeout(() => {
setThingVisible(true);
}, 2000); return function cleanup() {
clearTimeout(timeoutId);
};
}, []); return thingVisible ? <section>Here's a thing for you!</section> : null;

代码不错,且有效。也许你在功能强大的开发机器上都没有发现性能差异。甚至在这个示例中,可能也没有实际的性能问题。但是想象一下,如果这些堆积起来,突然之间,有数十或数百个类似的不必要的JS计算将在客户端运行,亦或者客户端正在执行一些更大、更长的执行。

使用HTML + CSS动画

使用CSS,你可以使用CSS动画和animation-delay对内容进行动画处理,以使其延迟显示在页面上。所有浏览器都支持此功能,甚至可以提供更好的终端用户体验,因为你可以淡入内容或使用任何其他方式使内容显现得更顺畅。

HTML:

<section class="fade-in">Here's a thing for you!</section>

CSS:

.fade-in {
opacity: 0;
animation: fadeIn 2s;
animation-delay: 2s;
animation-fill-mode: forwards;
} @keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}

可以使用HTML处理,就不用CSS

同理,如果是可以或应该用HTML处理的一些内容,那么就不要使用CSS进行操作。

一个极端的例子是,假设我们不小心使用边距隔离两个单词,而不是在单词之间使用空格!这显然不是一个好主意,至少从以下几个方面来看:

  • 可能不遵循字体大小,字母间距等。
  • 没有必要,浪费精力
  • 如果有人需要复制文本,那么单词之间会没有空格

前端开发并不容易

Web前端开发不是一个容易掌握的主题。快速入门可以,但是要掌握它则需要一定程度的经验和学习的积累,才能够使用正确的工具,在恰当的水平上解决正确的问题。解决前端中的问题时会涉及到很多层次和细节。

此外,由于各种原因(例如性能,可用性或可维护性等),你需要了解何时应该在后端而不是在前端解决问题。

总而言之,请记住,有时候我们无需绞尽脑汁地寻求完美的解决方案,可能一些可行的方案就足以应付生产发布和供终端用户使用。

(文本完)

每日分享前端插件和前端开发教程,欢迎扫码关注我的公众号:前端新世界

写个锤子JS!它应该是你最后的选择的更多相关文章

  1. 奇舞js笔记——第0课——如何写好原生js代码

    摘要 1.好的代码职责要清晰,javscript不要用来操作样式: 2.API要设计的合理:通用性,适度的抽象(数据抽象,过程抽象),可扩展性: 3.效率问题:用好的.合适的算法(前端程序员要把自己当 ...

  2. 模仿console自写函数打印js的对象

    本以为写个递归函数就可以将js的对象打印出来. 当然第一个想到的估计是JSON.stringify() 这个函数.但这个函数打印到浏览器 显示效果不友好.最友好的显示肯定是 控制台打印咯. 结果尝试打 ...

  3. 写给Node.js新手的7个小技巧

    一些我更愿意在开始就知道东西 利用 Node.js 开发是一个非常有趣,和令人满足的过程, 他有3万多个模块可以选择使用,并且所有的模块可以非常容易的集成入现有的应用之中. 无论如何,对于一些刚开始使 ...

  4. 一款非常好用的boostrap的验证插件、再也不用自己手写正则表达式和js了

    基于jquery.bootstrap数据验证插件bootstrapValidator教程 bootstrap:能够增加兼容性的强大框架. 因为项目需要数据验证,看bootstrapValidator ...

  5. 后端程序员写的前端js代码模板

    看几天的javascript面向对象和基础等之类相关javascript的知识,因为自己是写php的,也写过java,所以想在写javascript代码的时候也能用上面向对象的思想, 折腾了一整天的j ...

  6. 调用百度API写了一个js翻译小工具

    目前还未完成的功能有:textarea高度自适应,移动端与pc端都写了.效果如图: html: <!DOCTYPE html> <html lang="en"&g ...

  7. Chrome开发小技巧--浏览器控制台现写并运行js代码--snippets

    想简单等运行一段js代码,以前可能会新建一个html 里面包含script标签,或者引入一个js,然后chrome浏览器打开.这样很麻烦. 想再console控制台写,也不方便,换行处理麻烦. 基于在 ...

  8. 转载--- 写给Node.js学徒的7个建议

    贴士 1: 在开发环境使用nodemon,在生产环境使用pm2 当你第一次开发Node.js应用的时候, 其中一件事情就是一次又一次的运行[file].js 就和揭伤疤一样. 当我第一次开发的node ...

  9. 选择年份 php的写法要比js简洁一些

    所以遇到下拉框默认选择的情况,用php写比较方便一些 <select type="text" class="form-control_2" name=&q ...

随机推荐

  1. u-boot 移植 --->6、引导Linux启动测试

    在引导Linux开机之前需要先清楚Linux启动的必要或者说是先决条件,这里就是提到了u-boot的作用了引用百度云---主要用于嵌入式系统的引导加载,其实在我调试下来总结一下就是初始化硬件这里的硬件 ...

  2. μC/OS-III---I笔记8---事件标志

    当任务需要同步时可以使用信号量.A任务给B任务发送消息后B任务才能继续运行.如果需要A任务给任务B传递数据的时候就可以采用消息队列.但对于繁杂任务的同步,比如多个时间发生以后执行一个事件,或者是C任务 ...

  3. 011.NET5_MVC解读Razor混编

    MVC开发 1. 什么是MVC? V-视图,呈现给用户看到的内容---表现层 C-控制器,控制业务逻辑计算,可定义多种返回类型.可以是视图模型.JSON.字符串等等 M-视图模型,用于视图和控制之间传 ...

  4. Windows 10 自带 free 屏幕截图/录像软件 Game Bar! 不仅仅是game-游戏呦! 高清晰,高保真,perfect!不仅仅是游戏呦!

    good news! good news! good news! 重要的事情说三遍! Windows 10 自带  屏幕截图/录像软件 Game Bar! 以后再也不用第三方的 盗版软件了! 对于Wi ...

  5. js 检测屏幕分辨率

    js 检测屏幕分辨率 class screenChecker { constructor() { this.screen = window.screen; this.fullscreen = fals ...

  6. SEO & JSON-LD & structured-data

    SEO & JSON-LD & structured-data script type="application/ld+json" script type=&quo ...

  7. Masterboxan INC金融:在区块链技术基础上推动业务模式的变革创新

    10月初,2020年国际区块链技术与应用大会在硅谷开幕,全球内外区块链技术项目团队.行业领导.专家等共聚一堂,围绕区块链技术与应用展开讨论交流.美国Masterboxan INC万事达资产管理有限公司 ...

  8. 如何快速搞定websocket

    5 个步骤快速掌握websocket消息发送和接收 1. 获取您的 appkey 先注册一个账号,登录后,创建一个应用,就能得到您的 appkey. 详情见 获取开发者账号和 appkey 2. 客户 ...

  9. AtCoder Beginner Contest 192 F - Potion

    题目链接 点我跳转 题目大意 给定 \(N\) 个物品和一个 \(X\) ,第 \(i\) 个物品的重量为 \(ai\),你可以从中选择任意个物品(不能不选) 假定选择了 \(S\) 个物品,物品的总 ...

  10. Spring的BeanFactoryPostProcessor接口

    接口简介 BeanFactoryPostProcessor 接口是 Spring 初始化 BeanFactory 时对外暴露的扩展点,Spring IoC 容器允许 BeanFactoryPostPr ...