You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Webpack打包Mustache.js模块失败问题求助

解决Webpack打包Mustache.js后页面报错的问题

看起来你遇到的核心问题是:Webpack打包后的Mustache没有暴露到全局环境,而你的代码(包括内嵌的模板逻辑或者modules.js)依赖全局的Mustache变量。当你用<script>标签引入时,Mustache会自动挂载到window.Mustache,所以能正常运行,但Webpack默认会把模块包裹在独立作用域里,不会自动暴露到全局。下面给你几个可行的解决方案:

方案1:用expose-loader将Mustache暴露到全局

你已经在用expose-loader处理jQuery,完全可以用同样的方式处理Mustache,让它挂载到window.Mustache上,这样你的内嵌模板和模块代码就能像之前一样调用全局的Mustache了。

两种实现方式:

  • 方式A:直接在引入时配置
    修改你的app.js里的Mustache引入语句:
require('expose-loader?Mustache!mustache');
// 其他引入保持不变
require("./js/modules.js");
// ...
  • 方式B:在webpack.config.js中添加全局规则
    这种方式更适合需要全局暴露多个模块的场景,避免在每个引入处写loader:
module.exports = {
  // 其他配置...
  module: {
    rules: [
      // 你的其他loader规则(比如babel、css等)
      {
        test: require.resolve('mustache'),
        use: [{
          loader: 'expose-loader',
          options: { exposes: ['Mustache'] }
        }]
      },
      // 你已有的jQuery expose规则也可以移到这里统一管理
      {
        test: require.resolve('jquery'),
        use: [{
          loader: 'expose-loader',
          options: { exposes: ['$', 'jQuery'] }
        }]
      }
    ]
  }
}

方案2:在依赖模块中正确引入并使用Mustache

如果不想依赖全局变量,更符合模块化的做法是在modules.js中明确引入Mustache并使用返回的变量,而不是直接调用全局的Mustache:

// modules.js顶部
const Mustache = require('mustache');

// 之后的代码里用这个变量调用方法,比如:
const renderedHtml = Mustache.render(template, data);

你之前在modules.js里加了require('mustache')但没生效,大概率是因为代码里还是在使用全局的Mustache,而不是这个const声明的变量。

方案3:用Webpack的ProvidePlugin自动注入Mustache

如果你希望所有模块都能直接使用Mustache变量,不用手动require,可以用Webpack内置的ProvidePlugin:

const webpack = require('webpack');

module.exports = {
  // 其他配置...
  plugins: [
    // 其他插件(比如HtmlWebpackPlugin等)
    new webpack.ProvidePlugin({
      Mustache: 'mustache'
    })
  ]
}

这样Webpack会自动在每个用到Mustache变量的模块顶部注入const Mustache = require('mustache'),你不用手动写引入语句,同时也避免了依赖全局变量。

为什么单独用

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:53:02