mirror of https://github.com/webpack/webpack.git
				
				
				
			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:
		
						commit
						49c0864551
					
				|  | @ -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; | ||||
|  | @ -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({ | ||||
|  |  | |||
|  | @ -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 = | ||||
|  |  | |||
|  | @ -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"), | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue