【问题标题】:How can I have webpack skip a module if it doesn't exist如果模块不存在,我如何让 webpack 跳过它
【发布时间】:2025-11-30 13:40:01
【问题描述】:

我正在尝试使用 WebPack 来包含“摊牌”。问题是摊牌将需要(“fs”)并检查返回值。这会使 WebPack 抛出错误。

似乎应该可以将 Webpack 配置为生成 shim,以便调用 require("fs") 将返回 false。

也许其中一种技术可能会奏效:http://webpack.github.io/docs/shimming-modules.html

这是 Showdown.js 代码。如果我在节点模块目录中注释掉这段代码,问题就解决了。不过,应该有更好的办法。

//
// Automatic Extension Loading (node only):
//

if (typeof module !== 'undefind' && typeof exports !== 'undefined' && typeof require !== 'undefind') {
    var fs = require('fs');

    if (fs) {
        // Search extensions folder
        var extensions = fs.readdirSync((__dirname || '.')+'/extensions').filter(function(file){
            return ~file.indexOf('.js');
        }).map(function(file){
            return file.replace(/\.js$/, '');
        });
        // Load extensions into Showdown namespace
        Showdown.forEach(extensions, function(ext){
            var name = stdExtName(ext);
            Showdown.extensions[name] = require('./extensions/' + ext);
        });
    }
}

【问题讨论】:

    标签: javascript require webpack showdown


    【解决方案1】:

    解决方案是切换到标记:https://www.npmjs.org/package/marked。就模块而言,摊牌库是有问题的。

    【讨论】:

      【解决方案2】:

      这个问题应该在摊牌 v >=1.0.0 中修复

      【讨论】:

        【解决方案3】:

        将其添加到 noParse 例如

        var config = {
            output: {
                path: buildPath,
                filename: 'bundle.js'
            },
            module: {
                noParse: [
                    /showdown/,
                ],
        

        并且 webpack 会假设它不包含任何对require?

        有用调用

        【讨论】:

          【解决方案4】:

          这似乎是一个摊牌问题而不是 webpack 问题。需要fs 的代码旨在仅在节点环境中运行。不幸的是,检查它是否在节点中运行的代码中有一些拼写错误(您发布的代码中的第一个 if 语句,undefind 而不是undefined)。

          有一个pull request 解决了这个尚未合并的问题。

          老实说,Showdown 库似乎不再维护(最后一次提交于 2012 年 11 月),因此如果可能的话,您最好寻找替代方案。

          【讨论】:

          • 为了记录,摊牌现在又回来了,新的维护者和那个拉请求已经被合并了。