
前端模块化的最后一块拼图——浏览器中如何运行模块
前端模块化的演变包括CJS、AMD、CMD、UMD和ESM,现代浏览器支持ESM,webpack负责模块处理和打包,确保在浏览器中高效运行模块,支持代码拆分和Tree Shaking以优化性能。
本文介绍了使用Hexo搭建和部署个人网站的过程,包括技术选型、博客架构、配置与插件、部署方案以及后续开发计划。Hexo因其简单的架构和良好的自定义性被选为平台,文中详细阐述了如何通过Git和CI/CD实现自动化部署,以及如何配置图床和优化SEO。还提供了多个Hexo主题的推荐和未来开发的计划,包括基于React的GUI管理工具。
在做博客之前先了解了一下国内已有的线上博客平台,因为其在SEO和曝光(自带流量,不用手动SEO)方面有一定的先天优势:
上述平台中知乎、掘金、思否我会尝试同步更新,博客园随缘更新。
目前国外我了解的开放博客解决方案(或者说本地博客部署框架)有:
最终,主要是因为个人对整个Hexo生态比较熟悉,选择了Hexo平台(并不是说其他平台不好)
对个人而言,Hexo有以下优点:
Hexo采用hexo-6.3.0
和node-v16.17.1
+npm-v9
在本地构建,主题使用Redefine(可能后续会进行改动和二次开发)。
在整个博客中,Hexo作为静态网站框架,起到Hold整个Markdown博客数据库并渲染成HTML、渲染其他静态网页两个作用。
如何创建Hexo博客这里就不再赘述了,网上有很多教程,这里也不做教程推荐。
参考我之前的项目 KiritoKing/hexo-msdoc-renderer,为博客增加以下基础功能:
具体静态页面部署方案见下方的Serverless 部署
由于除了博客,个人网站还需要显示其他页面,目前个人有以下解决方案:
./source
中创建对应目录映射为URL,将单页面静态网站放在目录中,使用_config.yml
中的skip_render
选项跳过渲染(生成时直接拷贝到public
中)./_data
动态渲染页面,模板EJS设计完成后PR方案A适用于不会经常改变的静态页面,如个人简历;方案B适用于动态页面,如项目列表,可能需要用Github抓取信息更新yml
文件来刷新页面;方案C适用于不同架构创建的页面(如React页面),且该页面可能有频繁改动的情况。
因为做过不少Hexo外包项目,这里收集了一些我个人觉得不错的主题:
目前打算开发一个基于React+Next/Electron的Hexo的GUI管理方案(hexo-utils
),不过不是编辑器类型而是偏管理向,按Package进行功能划分如下:
hexo-utils/git-utils
:实现可配置的自动化Git工作流
hexo-utils/core
:维护应用所需数据和逻辑,钩入hexo-hooks
hexo-utils/cli
:为core
添加CLI入口hexo-utils/webui
:为core
添加Web-UI入口,作为hexo插件引用,用react+next实现hexo-utils/client
:使用electron封装core
功能,支持管理多个hexo目录hexo-utils/notion-utils
:与Notion双向同步构建知识管理和分享体系
我一直都习惯用 Typora 进行写作,习惯了所以也入了正版 我一直都习惯用 Typora 进行写作,习惯了所以也入了正版 (其实是当时不知道beta可以一直用~~(其实是当时不知道beta可以一直用~~。。
之前一直用的picgo的GUI客户端,因为最开始接触MD写作的时候并不会写前端和Node那一块,所以就用了gui,但越到后面越发现这个electron的客户端就是个性能累赘:不仅冷启动速度慢还经常卡死,而且是一个根本不必要的功能(指上传完全可以用cli实现),所以就借此机会切换到picgo-core。
切换到CLI后可以做到0秒冷启动的效果,非常顺滑,而且没有一个额外的electron进程占后台。本文所有图片均使用picgo-core上传。
首先你先要有一个包管理器(npm, yarn, pnpm)都可以:
# 这里以npm为例
npm i picgo -g
然后是配置图床,个人使用的是腾讯云COS作为图床:
picgo set uploader
运行CLI向导,运行完毕后你的配置文件应如下图所示:上传成功会得到如下提示:
首先全局安装这个包:
picgo install super-prefix
然后在配置文件里添加和修改下面的代码,就可以让图片存储在对应存储桶的YYYY/MM/YYYYMMDDHHmmss.*
路径里(如*/picgo-core/2023/05/20230522221603.png
):
{
"picgoPlugins": {
"picgo-plugin-super-prefix": true
},
"picgo-plugin-super-prefix": {
"prefixFormat": "YYYY/MM/",
"fileFormat": "YYYYMMDDHHmmss"
}
}
利益相关:无,希望腾讯看到了早日给我打钱或者把我招进去
(一些废话)这部分其实是2023年6月份才更新的,原因是想对博客做SEO优化,发现原来的部署总是失败,点开日志发现是环境缺失了一些包(详见hexo-all-minifier)。前些日子正好学习了一些CI和Docker相关的知识,也了解了微服务和无服务(serverless)部署的基础知识,正好成为了研究部署工作的契机。
在我不知道什么时候,腾讯云的整个Serverless架构都发生了变化:
Cloudbase 云开发:整个腾讯云微服务/无服务(serverless)的部署框架和底层平台实现,按月订阅并提供全部服务
虽然腾讯的文档很乱(痛批腾讯的一贯风格),不过整个Webify的体验是明显的好于Cloudbase+静态网页托管的流程的(虽然应该只是做了一层业务封装),整个体验上看起来是对标Vercel的,甚至支持一键部署。
上图就是现在我使用的腾讯云业务现在彼此的关系,所谓“Web应用托管”其实就是Serverless部署服务+提供“快捷网页托管”相关的Docker镜像,即新方案应该就是旧方案的业务整合+拆分,并没有本质上的区别。
Web 应用托管采用按量计费模式,自身能力免费,应用按照其使用的 TCB 底层环境的各项资源独立计费,如静态托管等。
由于腾讯云的方案无法做加载优化(资源压缩处理)和SEO优化,原因是其Hexo模板的Dockerfile是写死的(而且node版本特别老),无法进行定制,因此我被迫尝试了其他方案进行尝试。这里先尝试了Github Page,因为其开源且文档丰富。
我对这里方案的要求有下:
解决原有环境问题,支持进行SEO和加载优化
hexo-all-minifier
做资源压缩和加载速度优化hexo-seo
做SEO优化这里参考了Hexo官方教程
username.github.io
(注意这里username和我们的用户名必须完全匹配)编写Github Action工作流
node --version
指令检查你电脑上的 Node.js 版本,并记下该版本.github/workflows/pages.yml
,具体代码如下,注意将node-version
字段的16
改成自己环境里的node版本gh-pages
分支中(由peaceiris/actions-gh-pages@v3
定义)# .github/workflows/pages.yml
name: Pages
on:
push:
branches:
- main # default branch
jobs:
pages:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v2
- name: Use Node.js 16.x
uses: actions/setup-node@v2
with:
node-version: "16"
- name: Cache NPM dependencies
uses: actions/cache@v2
with:
path: node_modules
key: ${{ runner.OS }}-npm-cache
restore-keys: |
${{ runner.OS }}-npm-cache
- name: Install Dependencies
run: npm install
- name: Build
run: npm run build
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./public
gh_pages
./source
目录下添加CNAME
文件,内容你自己的域名,如下所示chlorinec.top
在更新完博客部署方式的几小时后,我发现我的域名已经不能正常访问了,感叹一下防火墙的速度,要是搜索引擎的爬虫有这一半快就好了。
学习过计网的同学都知道,CDN是一种部署在端侧的缓存加速方案,CDN(内容分发网络)负责缓存通过网络的内容,并将这些缓存的内容传递给就近的用户,使用户可以从就近的CDN源获取而不是远方的源服务器。
正常情况下CDN是加速网络访问,缓解主信道压力的手段,在某些不可言说的特殊网络波动因素的影响下,CDN就成了拯救页面可访问性的救命稻草。
这里我选择Cloudfare的国内服务进行CDN加速服务,因为其对个人开发者提供免费服务。
dayana.ns.cloudflare.com
rob.ns.cloudflare.com
当域名配置了HTTPS时可能会遇到“重定向次数过多”的问题,这是CDN的回源政策导致的,解决方案如下:
Cloudface默认提供了4种回源(用户请求CDN服务器,CDN服务器请求源服务器再返回给用户的过程)政策,当源网站和CDN的HTTPS(SSL)设置冲突时就会发生循环重定向。
Vercel部署很简单,直接注册账号选仓库就行,一切都是自动化的。
作者: ChlorineC
创建于: 2023-04-21 16:41:00
更新于: 2025-01-11 21:00:00
版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
前端模块化的演变包括CJS、AMD、CMD、UMD和ESM,现代浏览器支持ESM,webpack负责模块处理和打包,确保在浏览器中高效运行模块,支持代码拆分和Tree Shaking以优化性能。
Bun 1.0是一个新的JavaScript运行时,作为Node.js的替代品,提供更快的包管理和开发解决方案。尽管目前在生产环境中尚不成熟,但它集成了多种工具,支持统一模块标准和Web API,具有显著的性能优势。Bun的包管理器速度比pnpm快4倍,支持原生JSX和TS,且具备构建工具的潜力。整体来看,Bun在运行时和工具链上均有加速效果,但仍需进一步发展以满足生产需求。
本文探讨了在React中使用react-use-websocket库来实现WebSocket功能的最佳实践,包括如何封装WebSocket逻辑、处理连接状态、发送和接收消息,以及使用ArrayBuffer传输文件。此外,文中还介绍了Socket.IO的工作原理及其与WebSocket的区别,提供了Node.js后端服务器的示例代码,展示了如何实现低延迟的双向通信和进度反馈。
pnpm是一个高效且节省空间的前端包管理器,通过改进的非扁平node_modules目录和硬链接机制优化依赖管理。与npm和yarn相比,pnpm在性能和兼容性上表现优越,尤其在缓存情况下安装速度更快。pnpm的安装过程分为解析、目录结构计算和链接依赖项三个步骤,采用符号链接解决幽灵依赖问题,并通过硬链接机制减少硬盘占用。pnpm还支持monorepo,并提供了操作全局store的命令。