Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Warns when the user is using special webpack syntax #736

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions packages/react-dev-utils/BlockUnsupportedWebpackLoaderSyntax.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/**
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/

// This Webpack plugin forbids usage of special webpack syntax
// to disable loaders (https://webpack.github.io/docs/loaders.html#loader-order)
// This makes it very coupled to webpack and might break in the future.
// See https://github.com/facebookincubator/create-react-app/issues/733.

'use strict';

class BlockUnsupportedWebpackLoaderSyntax {
apply(compiler) {
compiler.plugin('normal-module-factory', (normalModuleFactory) => {
normalModuleFactory.plugin('before-resolve', (data, callback) => {
let error = null;
if (data.request.match(/^-?!!?/)) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It'd be best to use the exact same regexps as webpack uses for this (which I believe can be found here https://github.com/webpack/webpack/blob/master/lib/NormalModuleFactory.js#L86)

error = `You are requesting '${data.request}'. Special Webpack Loaders syntax is not officially supported and makes you code very coupled to Webpack, which might break in the future, we recommend that you remove it. See https://github.com/facebookincubator/create-react-app/issues/733`;
}
callback(error, data);
});
});
}
}

module.exports = BlockUnsupportedWebpackLoaderSyntax;
25 changes: 25 additions & 0 deletions packages/react-dev-utils/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,31 @@ module.exports = {
}
```

#### `new BlockUnsupportedWebpackLoaderSyntax()`

This Webpack plugin warns the user when using special webpack syntax for
disabling loaders (like `!!file!./stuff`). This makes it very coupled
to webpack special syntax and might break in the future.
See [#733](https://github.com/facebookincubator/create-react-app/issues/733) for details.

```js
var path = require('path');
var BlockUnsupportedWebpackLoaderSyntax = require('react-dev-utils/BlockUnsupportedWebpackLoaderSyntax');

// Webpack config
module.exports = {
// ...
plugins: [
// ...
// This forbids usage of Webpack Special Loader syntax, which makes it
// very coupled to Webpack and might break in the future.
// See https://github.com/facebookincubator/create-react-app/issues/733
new BlockUnsupportedWebpackLoaderSyntax()
],
// ...
}
```

#### `checkRequiredFiles(files: Array<string>): boolean`

Makes sure that all passed files exist.
Expand Down
7 changes: 6 additions & 1 deletion packages/react-scripts/config/webpack.config.dev.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ var HtmlWebpackPlugin = require('html-webpack-plugin');
var CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin');
var InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin');
var WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin');
var BlockUnsupportedWebpackLoaderSyntax = require('react-dev-utils/BlockUnsupportedWebpackLoaderSyntax');
var getClientEnvironment = require('./env');
var paths = require('./paths');

Expand Down Expand Up @@ -216,7 +217,11 @@ module.exports = {
// to restart the development server for Webpack to discover it. This plugin
// makes the discovery automatic so you don't have to restart.
// See https://github.com/facebookincubator/create-react-app/issues/186
new WatchMissingNodeModulesPlugin(paths.appNodeModules)
new WatchMissingNodeModulesPlugin(paths.appNodeModules),
// This forbids usage of Webpack Special Loader syntax, which makes it
// very coupled to Webpack and might break in the future.
// See https://github.com/facebookincubator/create-react-app/issues/733
new BlockUnsupportedWebpackLoaderSyntax()
],
// Some libraries import Node modules but don't use them in the browser.
// Tell Webpack to provide empty mocks for them so importing them works.
Expand Down