应通过专用文件(如 utils/shared-fields.js)导出受控字段(如 userid、islogin、formattimeago),朋友圈页面按需解构引入,避免全局污染;需响应式时可扩展订阅机制。

在微信小程序或类似支持模块化开发的前端框架中,“朋友圈”模块通常指一个独立的功能域(如 pages/friends-circle/),它需要复用底层通用逻辑或状态字段(如用户身份、登录态、基础配置等)。但直接暴露全局变量不安全,也不符合模块封装原则。真正可行的做法是:通过模块导出(exports 或 ES6 export)+ 显式引入(import 或 require),结合“约定式共享字段”实现受控、可维护的变量共享。
明确哪些字段适合被“朋友圈”模块使用
不是所有底层变量都该暴露。只导出经过抽象、无副作用、语义清晰的字段,例如:
-
用户基础信息:如
currentUser.id、currentUser.nickName(脱敏后) -
运行时上下文:如
isLogin、appVersion、env(dev/test/prod) -
通用工具函数:如
formatTimeAgo()、truncateText()—— 它们依赖底层但不持有状态
用 exports / export 分层导出,避免污染顶层
不要在根目录或 app.js 中挂载大量属性到 getApp()。推荐在专用文件中集中定义和导出,例如:
utils/shared-fields.jsconst shared = {
// 从 storage 或全局 store 中读取一次,不实时监听
get userId() { return wx.getStorageSync('uid') || '' },
get isLogin() { return !!wx.getStorageSync('token') },
get env() { return __ENV__ || 'dev' },
formatTimeAgo: (ts) => { /* ... */ }
}
<p>// CommonJS 写法(小程序原生支持)
module.exports = shared</p><p>// 或 ES6 写法(需构建工具支持)
// export default shared
</p>
在朋友圈页面中按需引入并使用
在 pages/friends-circle/index.js 中,直接导入所需字段,不引入整个对象:
// 方式1:解构导入(推荐)
const { userId, isLogin, formatTimeAgo } = require('../../utils/shared-fields')
<p>Page({
data: {
userId,
isLogin
},
onLoad() {
console.log('当前用户ID:', userId)
this.setData({ formattedTime: formatTimeAgo(Date.now() - 3600000) })
}
})
</p>
这样既保证字段来源清晰,又避免意外修改原始导出对象(因 getter 返回的是值,非引用)。
进阶:配合状态管理做轻量响应式共享
若“朋友圈”需响应登录态变化(如退出后自动跳转),单纯静态导出不够。此时可扩展为:
- 导出一个
subscribeAuthChange(callback)方法,内部监听loginStateChange自定义事件 - 或在
shared-fields.js中返回一个带on/off的简易 emitter 实例 - 朋友圈页面在
onLoad中订阅,在onUnload中取消,保持生命周期一致











