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'),你不用手动写引入语句,同时也避免了依赖全局变量。
为什么单独用
相关产品推荐
相关产品推荐

