Merge pull request #13725 from webpack/bugfix/serialize-json-as-buffer

serialize json data as buffer and decode on demand
This commit is contained in:
Tobias Koppers 2021-07-06 18:15:14 +02:00 committed by GitHub
commit 49c0864551
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 52 additions and 3 deletions

41
lib/json/JsonData.js Normal file
View File

@ -0,0 +1,41 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
"use strict";
const { register } = require("../util/serialization");
class JsonData {
constructor(data) {
this._buffer = undefined;
this._data = undefined;
if (Buffer.isBuffer(data)) {
this._buffer = data;
} else {
this._data = data;
}
}
get() {
if (this._data === undefined && this._buffer !== undefined) {
this._data = JSON.parse(this._buffer.toString());
}
return this._data;
}
}
register(JsonData, "webpack/lib/json/JsonData", null, {
serialize(obj, { write }) {
if (obj._buffer === undefined && obj._data !== undefined) {
obj._buffer = Buffer.from(JSON.stringify(obj._data));
}
write(obj._buffer);
},
deserialize({ read }) {
return new JsonData(read());
}
});
module.exports = JsonData;

View File

@ -116,7 +116,10 @@ class JsonGenerator extends Generator {
* @returns {number} estimate size of the module
*/
getSize(module, type) {
let data = module.buildInfo && module.buildInfo.jsonData;
let data =
module.buildInfo &&
module.buildInfo.jsonData &&
module.buildInfo.jsonData.get();
if (!data) return 0;
return stringifySafe(data).length + 10;
}
@ -145,7 +148,10 @@ class JsonGenerator extends Generator {
concatenationScope
}
) {
const data = module.buildInfo && module.buildInfo.jsonData;
const data =
module.buildInfo &&
module.buildInfo.jsonData &&
module.buildInfo.jsonData.get();
if (data === undefined) {
return new RawSource(
runtimeTemplate.missingModuleStatement({

View File

@ -8,6 +8,7 @@
const parseJson = require("json-parse-better-errors");
const Parser = require("../Parser");
const JsonExportsDependency = require("../dependencies/JsonExportsDependency");
const JsonData = require("./JsonData");
/** @typedef {import("../../declarations/plugins/JsonModulesPluginParser").JsonModulesPluginParserOptions} JsonModulesPluginParserOptions */
/** @typedef {import("../Parser").ParserState} ParserState */
@ -41,7 +42,7 @@ class JsonParser extends Parser {
? source
: parseFn(source[0] === "\ufeff" ? source.slice(1) : source);
state.module.buildInfo.jsonData = data;
state.module.buildInfo.jsonData = new JsonData(data);
state.module.buildInfo.strict = true;
state.module.buildMeta.exportsType = "default";
state.module.buildMeta.defaultObject =

View File

@ -156,6 +156,7 @@ module.exports = {
require("../dependencies/WebpackIsIncludedDependency"),
"dependencies/WorkerDependency": () =>
require("../dependencies/WorkerDependency"),
"json/JsonData": () => require("../json/JsonData"),
"optimize/ConcatenatedModule": () =>
require("../optimize/ConcatenatedModule"),
DelegatedModule: () => require("../DelegatedModule"),