webpack-contrib / bundle-loader

Bundle Loader
MIT License
658 stars 59 forks source link

Loading JSON files with bundle-loader crashes #74

Open ephys opened 6 years ago

ephys commented 6 years ago

Hello,

I'm not sure what I'm doing wrong but for some reason, if I try to lazily load JSON files using this loader, webpack interprets the generated loading code as if it were JSON too and tries to parse it.

This happens using Webpack 4.1.1

I assume it's because the name of the resource bundle-loader generates ends with .json too. (eg. ./node_modules/bundle-loader?lazy&name=file-[name]!./json-files/a.json)

I reproduced the issue using only bundle-loader and a couple of JSON files here: http://github.com/Ephys/bundle-loader-bug

Here is the webpack log of the above project: https://github.com/Ephys/bundle-loader-bug/blob/master/stacktrace.log

Thank you in advance for your help! :)

ephys commented 6 years ago

If anyone else is encountering the same bug, my current workaround is to go back to using to json-loader:

module: {
  rules: [{
    test: /\.json$/i,
    type: 'javascript/auto',
    loader: 'json-loader',
  }],
},

Sadly I haven't found a way to do that for bundle-loader-loaded JSON files only (resourceQuery can be used but you'd need to flag every use of bundle-loader in your codebase)

rmja commented 6 years ago

I think this is related to https://github.com/webpack/webpack/issues/6572, as applying https://github.com/webpack/webpack/issues/6572#issuecomment-375012740 fixes the issue.

rmja commented 6 years ago

Adding the following code snippet just before return result.join(""); resolves the issue but it is not nice. I don't know how to property get the generator and parser instance:

if (this._module.type !== "javascript/auto") {
        this._module.type = "javascript/auto";
        for (var i = 0, ii = this._compilation.modules.length; i < ii; i++) {
            if (this._compilation.modules[i].type === "javascript/auto") {
                this._module.generator = this._compilation.modules[i].generator;
                this._module.parser = this._compilation.modules[i].parser;
                break;
            }
        }
    }

Is there a better api to get the instance other then searching in the other modules?