如何使用webpack加载目录中的所有文件而不使用require语句

Chi*_*Fur 89 javascript build webpack

我有大量的javascript文件分成我的应用程序中的4个子目录.在grunt中,我抓住所有这些并将它们编译成一个文件.这些文件没有module.exports函数.

我想使用webpack并将其拆分为4个部分.我不想手动进入并要求我的所有文件.

我想创建一个插件,在编译时遍历目录树,然后抓取所有.js文件名和路径,然后需要子目录中的所有文件并将其添加到输出中.

我希望每个目录中的所有文件都编译成一个模块,然后我可以从我的入口点文件中获取,或者包含在http://webpack.github.io/docs/plugins.html提到的资产中.

添加新文件时,我只想将其放在正确的目录中,并知道它将被包含在内.

有没有办法用webpack或插件执行此操作?

spl*_*tor 106

这就是我为实现这一点所做的:

function requireAll(r) { r.keys().forEach(r); }
requireAll(require.context('./modules/', true, /\.js$/));
Run Code Online (Sandbox Code Playgroud)

  • 你能为你提供webpack.config.js的工作示例吗? (11认同)
  • @Joel https://www.npmjs.com/package/require-context创建于2017年,我的回答是从2015年开始的,所以很难说它是直接从那里获取的。另请注意,“ require-context”是“ webpack”的包装,其示例摘自https://webpack.js.org/guides/dependency-management/#context-module-的“ webpack”文档。 api-于2016年添加(在https://github.com/webpack/webpack.js.org/commit/ee8a1989c20943fd559230adc94b94206467eaea08),也是在我写完答案之后……也许webpack的作者受到了我的答案的影响。请注意,他们将其扩展为具有缓存。 (3认同)
  • @bobbaluba,你可以在配置文件中指定加载器:`loaders:[{test:/\.json $ /,loader:'json'}]`.`{test:/\.json $ /,loader:'json'}`为.json文件添加json加载器,只要你已经安装了加载器. (2认同)

Chi*_*Fur 36

在我的app文件中,我最终提出了要求

require.context(
  "./common", // context folder
  true, // include subdirectories
  /.*/ // RegExp
)("./" + expr + "")
Run Code Online (Sandbox Code Playgroud)

感谢这篇文章:https://github.com/webpack/webpack/issues/118

它现在正在添加我的所有文件.我有一个html和css的加载器,它似乎工作得很好.

  • 这个例子中的`expr`是什么? (26认同)
  • 即使在查看webpack文档之后,我仍然不清楚基于`expr`的论点在做什么."这不只是为了要求所有的html文件"是什么意思?谢谢 (16认同)
  • 我得到了**Uncaught ReferenceError:没有定义expr**.有什么暗示吗? (3认同)
  • `expr`是上下文文件夹中单个文件的路径.因此,如果您需要这样做而不仅仅是为了要求所有的html文件,这很有用.https://webpack.github.io/docs/context.html#context-module-api (2认同)
  • 关于`expr`在这里的含义仍然没有答案 (2认同)

Ste*_*las 7

一个文件夹中所有文件的映射怎么样?

// { 
//   './image1.png':  'data:image/png;base64,iVBORw0KGgoAAAANS',
//   './image2.png':  'data:image/png;base64,iVBP7aCASUUASf892',
// }
Run Code Online (Sandbox Code Playgroud)

做这个:

const allFiles = (ctx => {
    let keys = ctx.keys();
    let values = keys.map(ctx);
    return keys.reduce((o, k, i) => { o[k] = values[i]; return o; }, {});
})(require.context('./path/to/folder', true, /.*/));
Run Code Online (Sandbox Code Playgroud)