251 строка
10 KiB
JavaScript
251 строка
10 KiB
JavaScript
var path = require("path");
|
|
var webpack = require("webpack");
|
|
const getCSSModuleLocalIdent = require('react-dev-utils/getCSSModuleLocalIdent');
|
|
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
|
|
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
|
|
|
// style files regexes
|
|
const cssRegex = /\.css$/;
|
|
const cssModuleRegex = /\.module\.css$/;
|
|
const sassRegex = /\.(scss|sass)$/;
|
|
const sassModuleRegex = /\.module\.(scss|sass)$/;
|
|
|
|
// common function to get style loaders
|
|
const getStyleLoaders = (cssOptions, preProcessor) => {
|
|
const loaders = [
|
|
{
|
|
loader: MiniCssExtractPlugin.loader,
|
|
options: Object.assign(
|
|
{},
|
|
{ publicPath: '../../' }
|
|
),
|
|
},
|
|
{
|
|
loader: require.resolve('css-loader'),
|
|
options: cssOptions,
|
|
},
|
|
{
|
|
// Options for PostCSS as we reference these options twice
|
|
// Adds vendor prefixing based on your specified browser support in
|
|
// package.json
|
|
loader: require.resolve('postcss-loader'),
|
|
options: {
|
|
// Necessary for external CSS imports to work
|
|
// https://github.com/facebook/create-react-app/issues/2677
|
|
ident: 'postcss',
|
|
plugins: () => [
|
|
require('postcss-flexbugs-fixes'),
|
|
require('postcss-preset-env')({
|
|
autoprefixer: {
|
|
flexbox: 'no-2009',
|
|
},
|
|
stage: 3,
|
|
}),
|
|
],
|
|
sourceMap: true,
|
|
},
|
|
},
|
|
];
|
|
if (preProcessor) {
|
|
loaders.push({
|
|
loader: require.resolve(preProcessor),
|
|
options: {
|
|
sourceMap: true,
|
|
},
|
|
});
|
|
}
|
|
return loaders;
|
|
};
|
|
|
|
module.exports = {
|
|
target: "web",
|
|
entry: {
|
|
main: "./src/main.ts",
|
|
configuration: "./src/configuration.ts"
|
|
},
|
|
output: {
|
|
filename: "[name].js",
|
|
libraryTarget: "amd"
|
|
},
|
|
externals: [
|
|
/^VSS\/.*/, /^TFS\/.*/, /^q$/
|
|
],
|
|
resolve: {
|
|
extensions: ["*", ".webpack.js", ".web.js", ".ts", ".tsx", ".js"],
|
|
modules: [path.resolve("./src"), "node_modules"],
|
|
alias: {
|
|
react: path.resolve('node_modules/react'),
|
|
},
|
|
},
|
|
module: {
|
|
rules: [
|
|
{
|
|
oneOf: [
|
|
{ test: /\.(png|woff|woff2|eot|ttf|svg)$/, loader: 'url-loader?limit=100000' },
|
|
{
|
|
test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/],
|
|
loader: require.resolve('url-loader'),
|
|
options: {
|
|
limit: 10000,
|
|
name: 'static/media/[name].[hash:8].[ext]',
|
|
},
|
|
},
|
|
{
|
|
test: cssRegex,
|
|
exclude: cssModuleRegex,
|
|
loader: getStyleLoaders({
|
|
importLoaders: 1,
|
|
sourceMap: true,
|
|
}),
|
|
// Don't consider CSS imports dead code even if the
|
|
// containing package claims to have no side effects.
|
|
// Remove this when webpack adds a warning or an error for this.
|
|
// See https://github.com/webpack/webpack/issues/6571
|
|
sideEffects: true,
|
|
},
|
|
// Adds support for CSS Modules (https://github.com/css-modules/css-modules)
|
|
// using the extension .module.css
|
|
{
|
|
test: cssModuleRegex,
|
|
loader: getStyleLoaders({
|
|
importLoaders: 1,
|
|
sourceMap: true,
|
|
modules: true,
|
|
getLocalIdent: getCSSModuleLocalIdent,
|
|
}),
|
|
},
|
|
// Opt-in support for SASS. The logic here is somewhat similar
|
|
// as in the CSS routine, except that "sass-loader" runs first
|
|
// to compile SASS files into CSS.
|
|
// By default we support SASS Modules with the
|
|
// extensions .module.scss or .module.sass
|
|
{
|
|
test: sassRegex,
|
|
exclude: sassModuleRegex,
|
|
loader: getStyleLoaders(
|
|
{
|
|
importLoaders: 2,
|
|
sourceMap: true,
|
|
},
|
|
'sass-loader'
|
|
),
|
|
// Don't consider CSS imports dead code even if the
|
|
// containing package claims to have no side effects.
|
|
// Remove this when webpack adds a warning or an error for this.
|
|
// See https://github.com/webpack/webpack/issues/6571
|
|
sideEffects: true,
|
|
},
|
|
// Adds support for CSS Modules, but using SASS
|
|
// using the extension .module.scss or .module.sass
|
|
{
|
|
test: sassModuleRegex,
|
|
loader: getStyleLoaders(
|
|
{
|
|
importLoaders: 2,
|
|
sourceMap: true,
|
|
modules: true,
|
|
getLocalIdent: getCSSModuleLocalIdent,
|
|
},
|
|
'sass-loader'
|
|
),
|
|
},
|
|
// Process application JS with Babel.
|
|
// The preset includes JSX, Flow, and some ESnext features.
|
|
{
|
|
test: /\.(js|mjs|jsx)$/,
|
|
// include: "src/",
|
|
|
|
loader: require.resolve('babel-loader'),
|
|
options: {
|
|
customize: require.resolve(
|
|
'babel-preset-react-app/webpack-overrides'
|
|
),
|
|
|
|
plugins: [
|
|
[
|
|
require.resolve('babel-plugin-named-asset-import'),
|
|
{
|
|
loaderMap: {
|
|
svg: {
|
|
ReactComponent: '@svgr/webpack?-prettier,-svgo![path]',
|
|
},
|
|
},
|
|
},
|
|
],
|
|
],
|
|
cacheDirectory: true,
|
|
// Save disk space when time isn't as important
|
|
cacheCompression: true,
|
|
compact: true,
|
|
},
|
|
},
|
|
// Compile .tsx?
|
|
{
|
|
test: /\.(ts|tsx)$/,
|
|
// include: "src/",
|
|
loader: require.resolve('ts-loader'),
|
|
options: {
|
|
transpileOnly: true, // disable type checker to speed up compilation - we will use it in fork plugin
|
|
configFile: "tsconfig.json",
|
|
},
|
|
},
|
|
// Process any JS outside of the app with Babel.
|
|
// Unlike the application JS, we only compile the standard ES features.
|
|
{
|
|
test: /\.(js|mjs)$/,
|
|
exclude: /@babel(?:\/|\\{1,2})runtime/,
|
|
loader: require.resolve('babel-loader'),
|
|
options: {
|
|
babelrc: false,
|
|
configFile: false,
|
|
compact: false,
|
|
presets: [
|
|
[
|
|
require.resolve('babel-preset-react-app/dependencies'),
|
|
{ helpers: true },
|
|
],
|
|
],
|
|
cacheDirectory: true,
|
|
// Save disk space when time isn't as important
|
|
cacheCompression: true,
|
|
|
|
// If an error happens in a package, it's possible to be
|
|
// because it was compiled. Thus, we don't want the browser
|
|
// debugger to show the original code. Instead, the code
|
|
// being evaluated would be much more helpful.
|
|
sourceMaps: false,
|
|
},
|
|
},
|
|
// "file" loader makes sure assets end up in the `build` folder.
|
|
// When you `import` an asset, you get its filename.
|
|
// This loader doesn't use a "test" so it will catch all modules
|
|
// that fall through the other loaders.
|
|
{
|
|
loader: require.resolve('file-loader'),
|
|
// Exclude `js` files to keep "css" loader working as it injects
|
|
// it's runtime that would otherwise be processed through "file" loader.
|
|
// Also exclude `html` and `json` extensions so they get processed
|
|
// by webpacks internal loaders.
|
|
exclude: [/\.(js|mjs|jsx)$/, /\.html$/, /\.json$/],
|
|
options: {
|
|
name: 'static/media/[name].[hash:8].[ext]',
|
|
},
|
|
},
|
|
]
|
|
}
|
|
]
|
|
},
|
|
plugins: [
|
|
// Generates an `index.html` file with the <script> injected.
|
|
new HtmlWebpackPlugin({
|
|
inject: false,
|
|
meta: false,
|
|
}),
|
|
new MiniCssExtractPlugin({
|
|
// Options similar to the same options in webpackOptions.output
|
|
// both options are optional
|
|
filename: 'static/css/[name].[contenthash:8].css',
|
|
chunkFilename: 'static/css/[name].[contenthash:8].chunk.css',
|
|
})
|
|
],
|
|
} |