为了账号安全,请及时绑定邮箱和手机立即绑定

用这些方法能让你的网页应用体积减几圈,加载更快🔥

标签:
WebApp

当你长时间进行一个项目时,你会发现添加的功能越多,web 应用就会变得越慢。虽然看起来添加一个 table,一个 button,或其他元素时,这些在真空中可能重量很大。结果,你可能会遇到一个不可接受的初始加载时间,可能超过10到30秒。

在这篇文章里,我想分享一些方法和小技巧,帮助你避免这些问题,让你的网站尽可能快地加载和减少文件体积。

🐜 使用 HMPL.js 实现基于服务器的方法

与下面描述的方法不同,该模块不会允许机器人抓取页面,但你可以把它连接到任何网络应用,或者任何网站,比如WordPress、Vue.js、Tilda、Next.js等,或者你想要的任何地方。

使用这个模块工作大致是这样的:

首页.html

    <main id="app"></main>

    <script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://unpkg.com/json5/dist/index.js"></script>
    <script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://unpkg.com/dompurify/dist/purify.min.js"></script>
    <script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://unpkg.com/hmpl-js/dist/hmpl.min.js"></script>

点击进入全屏,点击退出全屏

client.js

    const templateFn = hmpl.compile(
      `<div>
          <button data-action="increment" id="btn">点击!</button>
          <div>点击数: {{ src: "/api/clicks", after: "click:#btn" }}</div>
      </div>`
    );

    const clicker = templateFn(({ request: { event } }) => ({
      body: JSON.stringify({ action: event.target.getAttribute("data-action") })
    })).response;

    document.querySelector("#app").append(clicker);

切换到全屏模式 切换出全屏模式

这里我们也得到渲染的HTML,没有明确的架构需要遵循。我们可以在任何项目中启用或禁用该模块,而不会有任何后果。它也很容易使用,因为它拥有少量但必要的功能。另外,你可以在示例中安全地删除after,并在DOM渲染过程中加载组件。

🌱 赶紧来看看 HMPL ★

⚙️ 平台依赖

如果你想减小网页应用的体积,那么首先你需要从你所使用的底层平台入手。以下是以 Next.js 为例,但如果网站是自行编写的,那么方法会有所不同。

点击图片查看 Vue 和 Angular 的介绍

因此,首先,值得寻找如何配置相同的框架或库以获得更好的结果,例如通过调整一两个参数,如服务器响应缓存,或者图片插件——这些功能有时已经包含在配置中了,剩下的就是找到它们。

👀 从CSR迁移到SSR (例如SSG, ISG等等)

将页面渲染的部分从客户端转移到服务器,是减少包大小的最有效的方式之一。这样你可以得到一种结构,其中组件会一块块地加载。因此,此类项目中的HTML和JS源文件只会包含加载组件所需的空标签和对服务器的请求,服务器会将这些现成的组件插入。

以下是一个这样的方法的例子:

index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title><%= data.title %></title>
    </head>
    <body>
        <h1><%= data.title %></h1>
        <p><%= data.content %></p>
    </body>
    </html>

全屏模式,退出全屏

server.js

    const express = require('express');
    const app = express();
    const PORT = 3000;

    // 将EJS设为模板引擎
    app.set('view engine', 'ejs');

    // 示例数据如下
    const data = {
        title: '服务端渲染示例',
        content: '这是使用Node.js和EJS进行服务端渲染的一个示例。'
    };

    // 定义一个路由如下
    app.get('/', (req, res) => {
        // 使用EJS渲染页面
        res.render('index', { data });
    });

    // 启动服务器
    app.listen(PORT, () => {
        console.log(`服务器运行在 http://localhost:${PORT}`);
    });

全屏模式 离开全屏模式

这里我们可以看到,EJS和Express让服务器端渲染所有内容变得可能。此外,将网站重构为Next.js后,不仅在单一页面上能够实现类似的效果,而且在其他页面上也能实现,包括但不限于动态路由,同时也能确保搜索引擎抓取和索引。

但是,这种方法制作SSR(SSG、ISG等)存在严重的缺点,因此可能并不适合。例如,如果网站已经在某些框架或库上,这些框架或库已经专注于客户端,那么重新做这一切可能需要大量时间和金钱。此外,选择这类工具(除了Next.js),可能会导致适合这些任务的人才短缺。如果一个人已经在某个框架上工作,而该职位并不流行且难以找到替代库,那么找到合适的候选人可能很困难。

为了保持面向服务器的方法,同时不遇到上述明显的这些问题,你可以使用HMPL.js或类似的库,比如。

🔎 其他几种有助于减小包的大小的通用技巧

在这里,如果我们不涉及与服务器的交互,而只是进行常规的 web 应用工作,那么下面提到的方法也可以帮助减少包的大小:

1. 🔗 去掉不必要的依赖

有时候,在开发 web 应用的过程中,你可能需要创建一些功能,于是会下载各种包,试一试,选择最合适的。忘了删除不再需要的包,相应的,包的大小只会越来越大。或者,如果为了完成一个本可以用普通的 js 就可以解决的任务而引入了一个庞大的模块,却只用了一个函数,这完全是多此一举。

要分析未使用的包的话,你可以使用例如下面这样的工具或类似的工具。

运行以下命令来安装和检查项目依赖项
npm install depcheck
depcheck /path/to/my/project

切换到全屏 切换出全屏

或如何?

运行 `npx depcheck` 可以检查项目的依赖情况。

切换到全屏模式,退出全屏

此模块虽然不被支持,但仍可让你分析依赖项并识别未使用的依赖项。但是,你需要谨慎使用,因为有些看起来未被使用的依赖项,实际上某些模块可能无法正常工作——这一点也需要留意。

您也可以通过运行以下命令来使用npm自带的功能。

在终端中运行以下命令: npm prune

进入全屏 退出全屏

这个命令会移除“不必要的”包。如果指定了包名,只会移除与指定名称匹配的包。

2. 📷 在项目中使用较小的媒体素材

这也许是给你的最简单且最明显的建议之一。如果你的项目中有一个视频文件大小堪比整个项目,那么使用 git clone 操作会变得相当棘手。

这种方法非常适合处理图像,在不损失任何质量的情况下,每张图片可以节省几MB的空间。现在,很多在线压缩工具都能轻松做到这一点。

图片(点击可查看图片)

此外,你可以将图片格式从png、jpg转换成webp。这也是一种好的做法,在许多大型网站中被使用。

3. 📡 使用 CDN 加速

这也是其中一种常见的方式,将模块从npm_modules转移到外部环境中。

    import { chunk } from "lodash";

点击进入全屏模式 点击退出全屏模式

还是

    <script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>

这里我们引入了一个lodash的JavaScript库来帮助我们处理一些常见的数据操作任务。

全屏模式 退出全屏

这和之前说的有点像,但是意思有点不一样。

4. ✂️ 代码拆分(将代码拆分为更小的部分)

最简单的方法之一就是通过动态加载来拆分代码。在现代构建工具如 Webpack 和 Vite 中,你可以轻松地这样操作。

main.js

document.getElementById('loadButton').addEventListener('click', () => {
    import('./module.js')
        .then(module => {
            module.default();
        })
        .catch(err => {
            console.error('加载模块时发生错误:', err);
        });
});

全屏模式。退出全屏

在这种情况下,我们不是立即加载模块,而是在用户点击按钮时才按需加载。

你还可以启用代码拆分。这在将通用代码拆分到不同模块时很有用。

webpack.config.js

    module.exports = {
        optimization: {
            splitChunks: {
                chunks: 'all',
            },
        },
    };

进入全屏 退出全屏

5. 代码精简.

你可以将代码压缩应用到编译过程中,以此减小打包大小。这绝对是你能采用的最好方法之一。

运行以下命令来压缩 JavaScript 文件:

uglifyjs file.js -c toplevel,sequences=false

全屏 退出全屏

为此,你可以用 Uglify.js,这是一个最受欢迎的代码压缩工具之一。它也可以与打包器一起使用,当然,如果它或者类似的工具没有被默认包含的话。

✅ 总结

首先,从列出的所有方法中,我试图描述那些几乎适用于每个Web应用程序的最通用的方法。这些方法很受欢迎,并且在处理这类任务时经常被采用。我也想避免提供关于DRY(Don't Repeat Yourself)和KISS(Keep It Simple, Stupid)原则的陈词滥调,因为这些原则在减少代码方面已经很明确,我更想提供一些具体的建议。但无论如何,我希望这些方法能帮助你的网站变得更小、更快速!

之类的

你可以在推特上关注作者哦!

感谢大家阅读这篇文章哦!❤️

谢谢

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消