diff --git a/client/index.css b/client/index.css index 3f7728b..140749e 100644 --- a/client/index.css +++ b/client/index.css @@ -1,6 +1,3 @@ -@import '../vendors/tachyons@4.10.0/tachyons.min.css'; -@import '../vendors/highlight.js@9.12.0/dracula.min.css'; - body { -webkit-font-smoothing: antialiased; } diff --git a/package-lock.json b/package-lock.json index 0b176b6..4272063 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5835,6 +5835,12 @@ "path-is-inside": "^1.0.2" } }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -6203,6 +6209,18 @@ "tiny-warning": "^1.0.2" } }, + "mini-css-extract-plugin": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", + "integrity": "sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + } + }, "minimalcss": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/minimalcss/-/minimalcss-0.8.1.tgz", @@ -6492,6 +6510,18 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -6938,6 +6968,12 @@ } } }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, "pretty-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", @@ -7094,6 +7130,16 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -8029,6 +8075,15 @@ } } }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -8218,6 +8273,12 @@ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", diff --git a/package.json b/package.json index 2397030..3da12b7 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "babel-loader": "^8.0.6", "css-loader": "^3.2.0", "html-webpack-plugin": "^3.2.0", + "mini-css-extract-plugin": "^0.8.0", "source-map-loader": "^0.2.4", "style-loader": "^1.0.0", "ts-loader": "^6.2.1", diff --git a/webpack.config.js b/webpack.config.js index ebf3654..d68cb86 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,12 +1,17 @@ const path = require('path'); const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; const HtmlWebPackPlugin = require("html-webpack-plugin"); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const plugins = [ new HtmlWebPackPlugin({ template: './client/index.html', filename: './index.html', }), + new MiniCssExtractPlugin({ + filename: '[name].[contenthash].css', + ignoreOrder: false, // Enable to remove warnings about conflicting order + }), ]; if (process.env.NODE_ENV === "analyse") { @@ -14,7 +19,14 @@ if (process.env.NODE_ENV === "analyse") { } module.exports = { - entry: './client/index.tsx', + entry: { + 'vendor-styles': [ + './vendors/tachyons@4.10.0/tachyons.min.css', + './vendors/highlight.js@9.12.0/dracula.min.css', + ], + // The CSS for client should come after `vendor-styles` + client: './client/index.tsx', + }, output: { path: path.join(__dirname, 'dist'), filename: '[name].[contenthash].js', @@ -28,7 +40,15 @@ module.exports = { rules: [ { test: /\.css$/, - use: ['style-loader', 'css-loader'], + use: [ + { + loader: MiniCssExtractPlugin.loader, + options: { + hmr: process.env.NODE_ENV === 'development', + }, + }, + 'css-loader', + ], }, { test: /\.ts(x?)$/,