Skip to content

Commit 544a594

Browse files
committed
Revert "Speed up TypeScript projects (facebook#5903)"
This reverts commit 5ce09db.
1 parent 72c49ac commit 544a594

File tree

11 files changed

+43
-193
lines changed

11 files changed

+43
-193
lines changed

packages/react-dev-utils/WebpackDevServerUtils.js

+20-96
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,22 @@ const inquirer = require('inquirer');
1717
const clearConsole = require('./clearConsole');
1818
const formatWebpackMessages = require('./formatWebpackMessages');
1919
const getProcessForPort = require('./getProcessForPort');
20-
const typescriptFormatter = require('./typescriptFormatter');
21-
const forkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
2220

2321
const isInteractive = process.stdout.isTTY;
22+
let handleCompile;
23+
24+
// You can safely remove this after ejecting.
25+
// We only use this block for testing of Create React App itself:
26+
const isSmokeTest = process.argv.some(arg => arg.indexOf('--smoke-test') > -1);
27+
if (isSmokeTest) {
28+
handleCompile = (err, stats) => {
29+
if (err || stats.hasErrors() || stats.hasWarnings()) {
30+
process.exit(1);
31+
} else {
32+
process.exit(0);
33+
}
34+
};
35+
}
2436

2537
function prepareUrls(protocol, host, port) {
2638
const formatUrl = hostname =>
@@ -101,20 +113,12 @@ function printInstructions(appName, urls, useYarn) {
101113
console.log();
102114
}
103115

104-
function createCompiler(
105-
webpack,
106-
config,
107-
appName,
108-
urls,
109-
useYarn,
110-
useTypeScript,
111-
devSocket
112-
) {
116+
function createCompiler(webpack, config, appName, urls, useYarn) {
113117
// "Compiler" is a low-level interface to Webpack.
114118
// It lets us listen to some events and provide our own custom messages.
115119
let compiler;
116120
try {
117-
compiler = webpack(config);
121+
compiler = webpack(config, handleCompile);
118122
} catch (err) {
119123
console.log(chalk.red('Failed to compile.'));
120124
console.log();
@@ -135,35 +139,10 @@ function createCompiler(
135139
});
136140

137141
let isFirstCompile = true;
138-
let tsMessagesPromise;
139-
let tsMessagesResolver;
140-
141-
if (useTypeScript) {
142-
compiler.hooks.beforeCompile.tap('beforeCompile', () => {
143-
tsMessagesPromise = new Promise(resolve => {
144-
tsMessagesResolver = msgs => resolve(msgs);
145-
});
146-
});
147-
148-
forkTsCheckerWebpackPlugin
149-
.getCompilerHooks(compiler)
150-
.receive.tap('afterTypeScriptCheck', (diagnostics, lints) => {
151-
const allMsgs = [...diagnostics, ...lints];
152-
const format = message =>
153-
`${message.file}\n${typescriptFormatter(message, true)}`;
154-
155-
tsMessagesResolver({
156-
errors: allMsgs.filter(msg => msg.severity === 'error').map(format),
157-
warnings: allMsgs
158-
.filter(msg => msg.severity === 'warning')
159-
.map(format),
160-
});
161-
});
162-
}
163142

164143
// "done" event fires when Webpack has finished recompiling the bundle.
165144
// Whether or not you have warnings or errors, you will get this event.
166-
compiler.hooks.done.tap('done', async stats => {
145+
compiler.hooks.done.tap('done', stats => {
167146
if (isInteractive) {
168147
clearConsole();
169148
}
@@ -173,43 +152,9 @@ function createCompiler(
173152
// them in a readable focused way.
174153
// We only construct the warnings and errors for speed:
175154
// https://github.com/facebook/create-react-app/issues/4492#issuecomment-421959548
176-
const statsData = stats.toJson({
177-
all: false,
178-
warnings: true,
179-
errors: true,
180-
});
181-
182-
if (useTypeScript && statsData.errors.length === 0) {
183-
const delayedMsg = setTimeout(() => {
184-
console.log(
185-
chalk.yellow(
186-
'Files successfully emitted, waiting for typecheck results...'
187-
)
188-
);
189-
}, 100);
190-
191-
const messages = await tsMessagesPromise;
192-
clearTimeout(delayedMsg);
193-
statsData.errors.push(...messages.errors);
194-
statsData.warnings.push(...messages.warnings);
195-
196-
// Push errors and warnings into compilation result
197-
// to show them after page refresh triggered by user.
198-
stats.compilation.errors.push(...messages.errors);
199-
stats.compilation.warnings.push(...messages.warnings);
200-
201-
if (messages.errors.length > 0) {
202-
devSocket.errors(messages.errors);
203-
} else if (messages.warnings.length > 0) {
204-
devSocket.warnings(messages.warnings);
205-
}
206-
207-
if (isInteractive) {
208-
clearConsole();
209-
}
210-
}
211-
212-
const messages = formatWebpackMessages(statsData);
155+
const messages = formatWebpackMessages(
156+
stats.toJson({ all: false, warnings: true, errors: true })
157+
);
213158
const isSuccessful = !messages.errors.length && !messages.warnings.length;
214159
if (isSuccessful) {
215160
console.log(chalk.green('Compiled successfully!'));
@@ -249,27 +194,6 @@ function createCompiler(
249194
);
250195
}
251196
});
252-
253-
// You can safely remove this after ejecting.
254-
// We only use this block for testing of Create React App itself:
255-
const isSmokeTest = process.argv.some(
256-
arg => arg.indexOf('--smoke-test') > -1
257-
);
258-
if (isSmokeTest) {
259-
compiler.hooks.failed.tap('smokeTest', async () => {
260-
await tsMessagesPromise;
261-
process.exit(1);
262-
});
263-
compiler.hooks.done.tap('smokeTest', async stats => {
264-
await tsMessagesPromise;
265-
if (stats.hasErrors() || stats.hasWarnings()) {
266-
process.exit(1);
267-
} else {
268-
process.exit(0);
269-
}
270-
});
271-
}
272-
273197
return compiler;
274198
}
275199

packages/react-dev-utils/typescriptFormatter.js

+2-5
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,12 @@ function formatter(message, useColors) {
4545
}
4646

4747
const severity = hasGetters ? message.getSeverity() : message.severity;
48-
const types = { diagnostic: 'TypeScript', lint: 'TSLint' };
4948

5049
return [
51-
messageColor.bold(`${types[message.type]} ${severity.toLowerCase()}: `) +
50+
messageColor.bold(`Type ${severity.toLowerCase()}: `) +
5251
(hasGetters ? message.getContent() : message.content) +
5352
' ' +
54-
messageColor.underline(
55-
(message.type === 'lint' ? 'Rule: ' : 'TS') + message.code
56-
),
53+
messageColor.underline(`TS${message.code}`),
5754
'',
5855
frame,
5956
].join(os.EOL);

packages/react-dev-utils/webpackHotDevClient.js

+8-10
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ function handleSuccess() {
106106
tryApplyUpdates(function onHotUpdateSuccess() {
107107
// Only dismiss it when we're sure it's a hot update.
108108
// Otherwise it would flicker right before the reload.
109-
tryDismissErrorOverlay();
109+
ErrorOverlay.dismissBuildError();
110110
});
111111
}
112112
}
@@ -140,15 +140,19 @@ function handleWarnings(warnings) {
140140
}
141141
}
142142

143-
printWarnings();
144-
145143
// Attempt to apply hot updates or reload.
146144
if (isHotUpdate) {
147145
tryApplyUpdates(function onSuccessfulHotUpdate() {
146+
// Only print warnings if we aren't refreshing the page.
147+
// Otherwise they'll disappear right away anyway.
148+
printWarnings();
148149
// Only dismiss it when we're sure it's a hot update.
149150
// Otherwise it would flicker right before the reload.
150-
tryDismissErrorOverlay();
151+
ErrorOverlay.dismissBuildError();
151152
});
153+
} else {
154+
// Print initial warnings immediately.
155+
printWarnings();
152156
}
153157
}
154158

@@ -179,12 +183,6 @@ function handleErrors(errors) {
179183
// We will reload on next success instead.
180184
}
181185

182-
function tryDismissErrorOverlay() {
183-
if (!hasCompileErrors) {
184-
ErrorOverlay.dismissBuildError();
185-
}
186-
}
187-
188186
// There is a newer version of the code available.
189187
function handleAvailableHash(hash) {
190188
// Update last known compilation hash.

packages/react-scripts/config/webpack.config.js

+11-5
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ const getCSSModuleLocalIdent = require('react-dev-utils/getCSSModuleLocalIdent')
2929
const paths = require('./paths');
3030
const getClientEnvironment = require('./env');
3131
const ModuleNotFoundPlugin = require('react-dev-utils/ModuleNotFoundPlugin');
32-
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
32+
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin-alt');
3333
const typescriptFormatter = require('react-dev-utils/typescriptFormatter');
3434
// @remove-on-eject-begin
3535
const getCacheIdentifier = require('react-dev-utils/getCacheIdentifier');
@@ -625,10 +625,17 @@ module.exports = function(webpackEnv) {
625625
typescript: resolve.sync('typescript', {
626626
basedir: paths.appNodeModules,
627627
}),
628-
async: isEnvDevelopment,
629-
useTypescriptIncrementalApi: true,
628+
async: false,
630629
checkSyntacticErrors: true,
631630
tsconfig: paths.appTsConfig,
631+
compilerOptions: {
632+
module: 'esnext',
633+
moduleResolution: 'node',
634+
resolveJsonModule: true,
635+
isolatedModules: true,
636+
noEmit: true,
637+
jsx: 'preserve',
638+
},
632639
reportFiles: [
633640
'**',
634641
'!**/*.json',
@@ -639,8 +646,7 @@ module.exports = function(webpackEnv) {
639646
],
640647
watch: paths.appSrc,
641648
silent: true,
642-
// The formatter is invoked directly in WebpackDevServerUtils during development
643-
formatter: isEnvProduction ? typescriptFormatter : undefined,
649+
formatter: typescriptFormatter,
644650
}),
645651
].filter(Boolean),
646652
// Some libraries import Node modules but don't use them in the browser.

packages/react-scripts/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
"eslint-plugin-jsx-a11y": "6.1.2",
4646
"eslint-plugin-react": "7.12.4",
4747
"file-loader": "2.0.0",
48-
"fork-ts-checker-webpack-plugin": "1.0.0-alpha.6",
48+
"fork-ts-checker-webpack-plugin-alt": "0.4.14",
4949
"fs-extra": "7.0.1",
5050
"html-webpack-plugin": "4.0.0-alpha.2",
5151
"identity-obj-proxy": "3.0.0",

packages/react-scripts/scripts/start.js

+1-16
Original file line numberDiff line numberDiff line change
@@ -94,24 +94,9 @@ checkBrowsers(paths.appPath, isInteractive)
9494
const config = configFactory('development');
9595
const protocol = process.env.HTTPS === 'true' ? 'https' : 'http';
9696
const appName = require(paths.appPackageJson).name;
97-
const useTypeScript = fs.existsSync(paths.appTsConfig);
9897
const urls = prepareUrls(protocol, HOST, port);
99-
const devSocket = {
100-
warnings: warnings =>
101-
devServer.sockWrite(devServer.sockets, 'warnings', warnings),
102-
errors: errors =>
103-
devServer.sockWrite(devServer.sockets, 'errors', errors),
104-
};
10598
// Create a webpack compiler that is configured with custom messages.
106-
const compiler = createCompiler(
107-
webpack,
108-
config,
109-
appName,
110-
urls,
111-
useYarn,
112-
useTypeScript,
113-
devSocket
114-
);
99+
const compiler = createCompiler(webpack, config, appName, urls, useYarn);
115100
// Load proxy config
116101
const proxySetting = require(paths.appPackageJson).proxy;
117102
const proxyConfig = prepareProxy(proxySetting, paths.appPublic);

test/fixtures/typescript-typecheck/.disable-pnp

Whitespace-only changes.

test/fixtures/typescript-typecheck/index.test.js

-33
This file was deleted.

test/fixtures/typescript-typecheck/package.json

-9
This file was deleted.

test/fixtures/typescript-typecheck/src/App.tsx

-13
This file was deleted.

test/fixtures/typescript-typecheck/src/index.tsx

-5
This file was deleted.

0 commit comments

Comments
 (0)