1

我有一个名为的webpack 加载器messageformat-loader,它接收 JSON,通过messageformat.js传递它,并输出格式函数的结果映射。它适用于单个文件。

./simple-messages.json

{
  "simple-example": "A simple message.",
}

./example.js

var messages = require('messageformat?locale=en!json!./simple-messages.json');
console.log(messages['simple-example']());

跑步

$ npm install webpack messageformat-loader messageformat@1.0.0-rc.3 json-loader
$ node_modules/.bin/webpack ./example.js bundle.js
<...omitted webpack output...>
$ node bundle.js
A simple message.

但是, messageformat.js 的CLI接受一组文件,然后在将文件传递给编译器之前,它使用文件名作为其键将其聚合到一个 JSON 对象中。

webpack由于不支持 glob,我将如何使用它来完成此操作?

./multi-example.js

var messages = require('messageformat?locale=en!json!./*.json');
console.log(messages['simple-messages']['simple-example']());

跑步

$ node_modules/.bin/webpack ./multi-example.js bundle.js
<...omitted webpack output...>

ERROR in ./multi-example.js
Module not found: Error: Cannot resolve 'file' or 'directory' ./*.json in <path>/test123
 @ ./multi-example.js 1:15-63
<path>/test123/bundle.js:47
  var messages = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module \"messageformat?locale=en!json!./*.json\""); e.code = 'MODULE_NOT_FOUND'; throw e; }()));

Error: Cannot find module "messageformat?locale=en!json!./*.json"
    at webpackMissingModule (<path>/test123/bundle.js:47:81)
    at Object.<anonymous> (<path>/test123/bundle.js:47:195)
    at __webpack_require__ (<path>/test123/bundle.js:20:30)
    at <path>/test123/bundle.js:40:18
    at Object.<anonymous> (<path>/test123/bundle.js:43:10)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Function.Module.runMain (module.js:441:10)

我的尝试:

  • 应用 globwebpack.config.js本身(如此推荐)

    • 如何汇总结果并将它们传递给messageformat-loader? 如果我不这样做,我将为messageformat.js每个 JSON 文件包含一次运行时。
      • 看起来这实际上可能是更好的方法,但我必须修改 messageformat.js 的输出以将运行时与字符串分开。
  • 使用require.context这里推荐)

    • 看上面
  • multi-json-loader

    • 不幸的是,这很尴尬,因为 webpack 需要一个资源文件,即使它没有被使用

      require('messageformat?locale=en!multi-json?cwd=data&glob=**/*.json!./irrelevant.whatever')
      
    • 我可以将 glob 移动到资源文件中,例如glob-loader,但是从源文件中提取加载程序的参数对我来说似乎更尴尬。

      • 这也是fontgen-loader所做的,所以这看起来是一种常见的方法。
  • 我应该做一个messageformat-plugin而不是装载机吗?然后我就可以完全控制这些块了。不过,这感觉像是错误的抽象。

4

1 回答 1

-1

我认为您想要的是所谓的“解析器”插件(与您的 webpack 加载器结合使用)。将插件和加载器配对并没有限制(请参阅提取文本插件:-)。

compiler.resolvers.normal.plugin('resolve', function resolverPlugin(request, cb) {
  ... 
});
于 2016-08-27T02:14:38.727 回答