在Webpack中加载多个资源文件,以便在messageformat.js

时间:2016-08-26 23:45:27

标签: webpack messageformat.js

我有一个名为webpackloader messageformat-loader,它接收JSON,传递给messageformat.js,并输出格式化函数的结果图。单个文件可以正常工作。

./简单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&#39; s CLI接受一个文件队列,然后在将文件传递给编译器之前,使用文件名作为其密钥聚合成一个JSON对象。

我如何使用webpack完成此操作,因为不支持全局?

./多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)

我的尝试:

  • webpack.config.js中自行应用glob(按照建议here

    • 如何汇总结果并将其传递到messageformat-loader?如果我不这样做,我会为每个JSON文件包含messageformat.js个运行时一次。
      • 看起来这可能是更好的方法,但我必须从字符串中将messageformat.js的输出修改为separate the runtime
  • 使用require.context(按照建议here

    • 见上文
  • multi-json-loader

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

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

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

1 个答案:

答案 0 :(得分:0)

我认为你想要的是所谓的“解析器”插件(与你的webpack加载器结合使用)。配对插件和加载器不受限制(请参阅extract text plugin: - )。

set.seed(1L);
dt1 <- data.table(id=1:12,expand.grid(V1=1:3,V2=1:4),blah1=rnorm(12L));
dt2 <- data.table(id=13:18,expand.grid(V1=1:2,V2=1:3),blah2=rnorm(6L));
dt1;
##     id V1 V2      blah1
##  1:  1  1  1 -0.6264538
##  2:  2  2  1  0.1836433
##  3:  3  3  1 -0.8356286
##  4:  4  1  2  1.5952808
##  5:  5  2  2  0.3295078
##  6:  6  3  2 -0.8204684
##  7:  7  1  3  0.4874291
##  8:  8  2  3  0.7383247
##  9:  9  3  3  0.5757814
## 10: 10  1  4 -0.3053884
## 11: 11  2  4  1.5117812
## 12: 12  3  4  0.3898432
dt2;
##    id V1 V2       blah2
## 1: 13  1  1 -0.62124058
## 2: 14  2  1 -2.21469989
## 3: 15  1  2  1.12493092
## 4: 16  2  2 -0.04493361
## 5: 17  1  3 -0.01619026
## 6: 18  2  3  0.94383621
key <- paste0('V',1:2);
dt1[dt2,on=key,id:=i.id];
dt1;
##     id V1 V2      blah1
##  1: 13  1  1 -0.6264538
##  2: 14  2  1  0.1836433
##  3:  3  3  1 -0.8356286
##  4: 15  1  2  1.5952808
##  5: 16  2  2  0.3295078
##  6:  6  3  2 -0.8204684
##  7: 17  1  3  0.4874291
##  8: 18  2  3  0.7383247
##  9:  9  3  3  0.5757814
## 10: 10  1  4 -0.3053884
## 11: 11  2  4  1.5117812
## 12: 12  3  4  0.3898432