如何整齐地限制Webpack`require.context`?

时间:2015-05-12 16:44:12

标签: javascript webpack

我正在Webpack和React上开发一点static site generator。目前我正在使它变得更有活力。其中一部分是使其更具可配置性。

给定像这样的网站结构

.
├── _book
├── assets
├── build
├── drafts
├── manuscript
├── node_modules
├── pages
├── project_source
└── styles

我想要只从某些目录或目录中获取文件。在这种情况下,要求manuscript的Markdown文件就足够了。天真地var req = require.context('manuscript', true, /^\.\/.*\.md$/)会起作用。

问题是,当我通过站点生成器配置传递目录时,这需要变为动态。由于require.context依赖于固定值,我认为我需要使用类似var req = require.context('.', true, /^.*\.md$/)的内容将上下文更改为网站根目录,然后检查req.keys()以匹配我的配置。

在实践中,这将非常缓慢,因为它将遍历整棵树!特别是node_modules可以包含大量文件,这是应该不惜一切代价避免的。

是否有一种巧妙的方法可以将node_modules排除在require.context之外?我认为某些形式的正则表达式可能有效,尽管我对其他想法持开放态度。

2 个答案:

答案 0 :(得分:8)

你可以尝试:

var req = require.context('.', true, /^((?![\\/]node_modules|vendor[\\/]).)*\.md$/);

从匹配项中排除包含node_modulesvendor文件夹的路径。

答案 1 :(得分:0)

我最终通过在静态站点生成器之外和外部配置中推送require.context来解决问题。我有这样的小片段:

paths: {
    demo: {
        path: function() {
            return require.context('./demo', true, /^\.\/.*\.md$/);
        },
    }
}

然后在发电机侧,我只是消耗这些上下文。

这不是我希望的解决方案,但它有效。