模块定义必须用layui.define()包裹并显式声明依赖(如['jquery','layer']),导出需用exports('name',obj)且命名唯一小写;配置extend时路径须与base严格匹配,使用前须校验参数并兼容多环境。

模块定义必须用 layui.define() 包裹,且依赖声明不能漏
不写 layui.define() 或漏掉关键依赖(比如 jquery、layer),模块加载时会直接报 Cannot read property 'xxx' of undefined。Layui 不自动注入全局 $ 或 layer,一切都要显式声明。
常见错误写法:layui.define(function(exports){ ... }) —— 缺少依赖数组,layui.$ 拿不到;或者只写 ['jquery'] 却在代码里用了 layui.layer.msg,运行时报 layer is not defined。
- 基础依赖建议按需写全:
['jquery', 'layer', 'form']是最常组合 - 如果插件含 DOM 渲染逻辑,必须加
jquery;含提示/弹窗,必须加layer - 避免写
['*']或空数组——Layui 不支持通配,也不允许省略
导出接口要用 exports(),名字必须唯一且小写
exports('myPlugin', obj) 中的 'myPlugin' 是模块在 layui 对象下的挂载名,一旦被其他模块占用(比如官方已有 'table'),就无法覆盖。命名冲突会导致 layui.myPlugin 为 undefined,但控制台不报错,极难排查。
开源插件尤其要注意:别用通用词如 'util'、'common'、'base',优先带项目前缀或缩写,例如 'xadmin-form-validator'。
- 名字中禁止出现大写字母、横线、下划线以外的符号(
exports('my-plugin')会失败) - 导出对象必须是纯对象字面量或构造函数,不能是立即执行函数返回值(
exports('xx', (function(){})())会导致模块不可复用) - 不要在
exports()后再写其他语句——Layui 解析到}就结束模块执行
配置 layui.config().extend() 时路径和别名要严格对应
很多人把模块文件放错位置,又没配对 extend,结果 layui.use(['myPlugin']) 一直加载失败,控制台只显示 GET http://xxx/myPlugin.js net::ERR_ABORTED 404。
正确做法是:模块文件路径(如 js/lay-module/my-plugin/my-plugin.js)必须与 extend 中的键值完全一致,且 base 要指向 lay-module 所在目录上级:
layui.config({ base: 'js/lay-module/' }).extend({ 'my-plugin': 'my-plugin/my-plugin' });- 注意:右侧值
'my-plugin/my-plugin'是相对于base的路径,不带.js后缀 - 如果模块放在
modules/下(非lay-module/),需同步改base,否则找不到
开源插件必须处理好初始化参数和默认行为
用户调用 myPlugin.render(elem, options) 时,如果没传 options 或传了 null,你的插件不能崩。Layui 官方模块都做了防御性处理,开源插件也得跟上。
典型坑点:直接解构 options.width 却没判空,或把 elem 当成 jQuery 对象用却没做 $(elem) 转换。
- 用
$.extend({}, defaults, options)合并配置,别用Object.assign(兼容 IE10) -
elem参数优先支持原生 DOM 和 jQuery 对象两种类型,统一转成$(elem)再操作 - 所有对外方法应有明确返回值(如返回实例本身支持链式调用),避免静默失败


















