Commit 2ed8eccf authored by Jason Laster's avatar Jason Laster Committed by Joe Haddad
Browse files

Switch to eval-source-map (#4930)

parent e8b0ee80
Showing with 57 additions and 3 deletions
+57 -3
/**
* Copyright (c) 2015-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
'use strict';
function base64SourceMap(source) {
const base64 = Buffer.from(JSON.stringify(source.map()), 'utf8').toString(
'base64'
);
return `data:application/json;charset=utf-8;base64,${base64}`;
}
function getSourceById(server, id) {
const module = server._stats.compilation.modules.find(m => m.id == id);
return module.originalSource();
}
/*
* Middleware responsible for retrieving a generated source
* Receives a webpack internal url: "webpack-internal:///<module-id>"
* Returns a generated source: "<source-text><sourceMappingURL><sourceURL>"
*
* Based on EvalSourceMapDevToolModuleTemplatePlugin.js
*/
module.exports = function createEvalSourceMapMiddleware(server) {
return function handleWebpackInternalMiddleware(req, res, next) {
if (req.url.startsWith('/__get-internal-source')) {
const fileName = req.query.fileName;
const id = fileName.match(/webpack-internal:\/\/\/(.+)/)[1];
if (!id || !server._stats) {
next();
}
const source = getSourceById(server, id);
const sourceMapURL = `//# sourceMappingURL=${base64SourceMap(source)}`;
const sourceURL = `//# sourceURL=webpack-internal:///${module.id}`;
res.end(`${source.source()}\n${sourceMapURL}\n${sourceURL}`);
} else {
next();
}
};
};
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
"crossSpawn.js", "crossSpawn.js",
"errorOverlayMiddleware.js", "errorOverlayMiddleware.js",
"eslintFormatter.js", "eslintFormatter.js",
"evalSourceMapMiddleware.js",
"FileSizeReporter.js", "FileSizeReporter.js",
"formatWebpackMessages.js", "formatWebpackMessages.js",
"getCSSModuleLocalIdent.js", "getCSSModuleLocalIdent.js",
......
...@@ -34,7 +34,11 @@ async function map( ...@@ -34,7 +34,11 @@ async function map(
}); });
await settle( await settle(
files.map(async fileName => { files.map(async fileName => {
const fileSource = await fetch(fileName).then(r => r.text()); const fetchUrl = fileName.startsWith('webpack-internal:')
? `/__get-internal-source?fileName=${encodeURIComponent(fileName)}`
: fileName;
const fileSource = await fetch(fetchUrl).then(r => r.text());
const map = await getSourceMap(fileName, fileSource); const map = await getSourceMap(fileName, fileSource);
cache[fileName] = { fileSource, map }; cache[fileName] = { fileSource, map };
}) })
......
...@@ -76,7 +76,7 @@ module.exports = { ...@@ -76,7 +76,7 @@ module.exports = {
mode: 'development', mode: 'development',
// You may want 'eval' instead if you prefer to see the compiled output in DevTools. // You may want 'eval' instead if you prefer to see the compiled output in DevTools.
// See the discussion in https://github.com/facebook/create-react-app/issues/343 // See the discussion in https://github.com/facebook/create-react-app/issues/343
devtool: 'cheap-module-source-map', devtool: 'eval-source-map',
// These are the "entry points" to our application. // These are the "entry points" to our application.
// This means they will be the "root" imports that are included in JS bundle. // This means they will be the "root" imports that are included in JS bundle.
// The first two entry points enable "hot" CSS and auto-refreshes for JS. // The first two entry points enable "hot" CSS and auto-refreshes for JS.
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
'use strict'; 'use strict';
const errorOverlayMiddleware = require('react-dev-utils/errorOverlayMiddleware'); const errorOverlayMiddleware = require('react-dev-utils/errorOverlayMiddleware');
const evalSourceMapMiddleware = require('react-dev-utils/evalSourceMapMiddleware');
const noopServiceWorkerMiddleware = require('react-dev-utils/noopServiceWorkerMiddleware'); const noopServiceWorkerMiddleware = require('react-dev-utils/noopServiceWorkerMiddleware');
const ignoredFiles = require('react-dev-utils/ignoredFiles'); const ignoredFiles = require('react-dev-utils/ignoredFiles');
const config = require('./webpack.config.dev'); const config = require('./webpack.config.dev');
...@@ -89,7 +90,10 @@ module.exports = function(proxy, allowedHost) { ...@@ -89,7 +90,10 @@ module.exports = function(proxy, allowedHost) {
}, },
public: allowedHost, public: allowedHost,
proxy, proxy,
before(app) { before(app, server) {
// This lets us fetch source contents from webpack for the error overlay
app.use(evalSourceMapMiddleware(server));
// This lets us open files from the runtime error overlay. // This lets us open files from the runtime error overlay.
app.use(errorOverlayMiddleware()); app.use(errorOverlayMiddleware());
// This service worker file is effectively a 'no-op' that will reset any // This service worker file is effectively a 'no-op' that will reset any
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment