uni-app中import失败主因是平台环境差异:非H5端无window/document,需用platform判断、动态导入或替换兼容库。

直接在 pages 或 components 里 import 失败?先看加载时机
uni-app 的 JS 执行环境不是纯浏览器,也不是纯 Node.js,而是基于 WebView(App)、小程序基础库(微信/支付宝等)或 H5 渲染层的混合环境。很多第三方库默认假设运行在浏览器全局对象 window 下,一上来就访问 window.document 或调用 fetch,在非 H5 平台会直接报错 Cannot read property 'document' of undefined。
实操建议:
- 优先选标有
ESM、UMD或明确支持tree-shaking的库,避免用只打包成IIFE的老版本 - 在
onLoad或mounted钩子之后再引入——尤其对依赖 DOM 的库(如echarts、highlight.js),H5 可能行,但小程序里document根本不存在 - 用
process.env.UNI_PLATFORM === 'h5'做平台判断,把浏览器专属逻辑包起来,否则微信小程序编译时可能直接中断
require 动态加载失败?别硬塞到 vendor 里
uni-app 构建时会把 node_modules 中的模块静态分析并打到 vendor.js,但如果你用 require('./xxx.js') 加载本地 JS 文件,或用 require 拼字符串(比如 require('./utils/' + name)),构建工具无法识别路径,运行时报 Cannot find module。
实操建议:
- 本地 JS 库统一放
static/目录下,用const lib = uni.requireNativePlugin('xxx')是错的——那是原生插件接口;正确方式是用uni.loadScript(仅 H5 支持)或改用import()动态导入 - 想让某个 npm 包不被 tree-shaking 掉,可在
vue.config.js的configureWebpack.externals里排除,但注意:小程序平台不支持 externals - 遇到
require is not defined,基本是用了 CommonJS 写法但目标平台没提供该运行时——换import(),它是标准且 uni-app 全平台支持的
微信小程序里 crypto、buffer 报错?不是缺 polyfill,是根本不能用
像 jsencrypt、uuid、axios 这类依赖底层 Node.js API 的库,在微信小程序里会直接崩,错误可能是 global is not defined 或 Buffer is not defined。这不是配置问题,是平台能力缺失。
实操建议:
- 别费劲找“小程序 crypto polyfill”——微信自己的
cryptoAPI 在uni.getSystemInfoSync().SDKVersion≥ 2.21.0 才开放,且只支持sha1/md5,aes得用uni.encrypt+ 后端配合 - 用
npm install uuid@8.3.2而不是最新版,v9+ 强制依赖crypto.randomUUID,小程序不支持 - 发请求别硬上
axios,uni-app 自带uni.request已封装超时、拦截、平台差异,axios的interceptors在 App 端可能失效,H5 和小程序行为也不一致
打包后体积暴涨?检查 externals 和 sideEffects
引入一个 50KB 的库,结果整个 vendor.js 多出 800KB,大概率是你没关掉它的副作用代码,或者它内部又引了 lodash 全量版。
实操建议:
- 在
package.json里加"sideEffects": false(如果库确实无副作用),否则 Webpack 默认保留所有 import - 用
npm ls xxx查依赖树,确认没意外带入moment、lodash全量包;替换成dayjs、lodash-es按需引入 - 微信小程序单个分包不能超 2MB,若引入
pdfjs-dist这类大库,必须用import('@pdfjs-dist/build/pdf.mjs')动态加载,并确保它不在主包pages.json的subNVue或usingComponents列表里
最常被忽略的一点:小程序平台不支持 eval、Function 构造函数,所以任何用到动态代码执行的库(比如某些模板引擎、旧版 lodash.template)在真机上会静默失败,连错误都捕获不到。遇到逻辑莫名跳过,先查有没有这类调用。










