当前位置:首页 > 知识

layui项目完整源码

layui 这个前端框架,目完码现在用的整源人少了。但如果你维护过2018年前后的目完码后台管理系统,大概率见过它——那种墨绿色调、整源圆角按钮、目完码自带分页表格的整源界面。我手头正好有一套完整的目完码 layui 项目源码,不是整源官网那个压缩包,是目完码实际跑在业务里的工程目录。打开文件夹,整源结构比想象中简单。目完码

根目录下就三样东西:index.html、整源layui/、目完码js/。整源没有 webpack,目完码没有 node_modules,连 package.json 都找不到。双击 index.html 就能跑起来。这跟现在动辄几百兆依赖的前端工程完全是两个物种。layui 的设计哲学就一句话:你不需要构建工具。

layui/ 文件夹里是框架本体。css 目录下 layui.css 大概 300KB,没压缩。js 目录下 layui.js 是核心,其余按模块拆开——table.js、form.js、laydate.js 各管一摊。有意思的是每个模块都带 layui.define 调用,这是它自己的模块加载机制。不依赖 requirejs 或 sea.js,自己实现了一套轻量方案。

我翻开源码里的 table 模块。表格渲染逻辑集中在 table.render() 函数里,参数对象传进去,内部先拼 thead,再根据 data 生成 tbody。分页部分单独抽了 laypage 模块,但 table 默认集成了。有个细节:表格列宽如果没指定,它会按内容自适应——这个计算过程写在 _getColWidth 里,遍历每列所有单元格取最大宽度,再累加。简单粗暴,但有效。

表单模块的验证规则挺实用。源码里 form.verify 定义了一组默认规则:required、phone、email、url、number、date、identity。每个规则对应一个正则或函数。比如 identity 校验身份证,源码里写了完整的 18 位加权因子计算。这种细节说明作者确实处理过真实业务。

弹层组件 layer 是独立打包的。源码里 layer.open() 支持 type 0 到 4,分别对应信息框、页面层、iframe 层、加载层、tips 层。每种类型的 DOM 结构都预先写在 layer.js 的模板字符串里。我注意到关闭动画用的是 CSS transition,不是 JS 动画库。这样做的好处是性能好,坏处是没法在动画中途取消。

项目里的 js/ 目录放业务代码。通常就一个 common.js 加几个页面脚本。common.js 里会写 layui.use(['form','table'], function(){ ...}),然后初始化各个模块。我见过有人把所有逻辑塞进 index.html 的 script 标签里,也能跑,就是难维护。

这套源码有个明显特点:注释很少。核心函数上面偶尔有一行 // 渲染表格 这种。但变量命名还算清楚,_this、that、options、callback 反复出现。读源码时得耐着性子跟踪调用链。比如点击分页按钮,会触发 laypage 的 jump 回调,然后 table 模块重新请求数据,再调 renderData 更新 tbody。整个过程没有虚拟 DOM,直接操作真实节点。

有人觉得 layui 过时了。但看这套源码,它的定位一直很清晰:给后端开发者用的 UI 库。不需要学 React 的 hooks,不需要配 TypeScript,引入一个 css 和一个 js,写几行 HTML 就能出界面。源码里甚至内置了 IE8 的兼容处理——layui.each 用 for 循环而不是 forEach,addClass 用 className += 而不是 classList。这些在今天看来是累赘,在当时是刚需。

如果你要改这套源码,建议从 layui.js 的 layui.define 入口看起。它维护了一个 modules 对象,每个模块加载后注册进去。然后 layui.use 按依赖顺序执行回调。整个框架没有异步加载的复杂逻辑,就是同步脚本插入。简单,但够用。

最后说个实际观察:这套源码跑在 Chrome 里,控制台会报一个 layui is not defined 的警告——因为 layui.js 末尾的 window.layui = layui 在某些加载顺序下执行晚了。解决办法是把 script 标签放到 body 末尾。这种小坑,只有真读过源码的人才知道。

分享到: