1

Problem Context

I have webpack working for compiling my typescript into javascript. Automatic reloading works when I change my typescript code. However, webpack is not watching my static html file.

.
├── dist
│   ├── index.html
│   └── style.css
├── src
│   └── index.ts
└── webpack.config.js

The problem is I need to make several changes in my index.html and webpack does not automatically detect those changes. And, if I refresh the html page, it seems to break webpack's webpack-dev-server.

Expected Output

I want everything to be in the src folder and when I run webpack I have a fully working static site in my dist folder. That is:

.                                      .
├── dist                               ├── dist
├── src                                │   ├── index.html
│   ├── index.html                     │   ├── bundle.js
│   ├── index.ts      npx webpack ->   │   └── style.css
│   └── style.css                      ├── src
└── webpack.config.js                  │   ├── index.html
                                       │   ├── index.ts
                                       │   └── style.css 
                                       └── webpack.config.js 

The files in the dist folder might have hashed filenames. I'm not worrying about that step for now though. I expect that webpack will go through my files and make sure they link to the correct resources. So if webpack were to give style.css a hashed name, the href in index.html would be updated.

Current Output

My current solution outputs both index.html and bundle.js, but I cannot get it to copy style.css into the dist folder. My current webpack.config.js looks like the this:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');

module.exports = {
  entry: './src/index.ts',
  devtool: 'inline-source-map',
  mode: 'development',
  devServer: {
      contentBase: './dist'
  },
  module: {
      rules: [
        {
            test: /\.tsx?$/,
            use: 'ts-loader',
            exclude: /node_modules/
        },
        {
            test: /\.css$/,
            use: [
                'style-loader',
                'css-loader'
            ]
        },
        {
            test: /\.html$/,
            use: [
                { loader: 'file-loader?name=[name].[ext]' },
                { loader: 'extract-loader' },
                { loader: 'html-loader' }
            ]
        }
      ]
  },
  plugins: [
    new CleanWebpackPlugin()
  ],
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  }
};

And my index.html looks like this:

<!doctype html>
<html>
  <head>
    <meta charset="UTF-8"> 
    <title>stuff</title>
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
    <script src="./bundle.js" charset="utf-8"></script>
  </body>
</html>

My index.ts contains:

import './index.html';

What I Tried

At first I tried just adding an import for my css into my index.ts:

import './style.css';

But this did not work. Next I looked at the html-loader documentation, and it seemed to hint at what I'm looking for: https://webpack.js.org/loaders/html-loader/ However, I've read that inlining loaders like that is deprecated, and looking through the source there doesn't seem to be any configuration option for interpolation. I tried to do it as described in the documentation anyways, but it either simply does not work, or gives me some error message about require not found (I can't seem to reproduce that error though). My index.html contained:

<link rel="stylesheet" href="${require(`style.css`)">

and index.ts contained:

require("html-loader?interpolate=require!./index.html");

How do I get webpack to move my style.css to the dist folder?

I have the hunch I'm misunderstanding how webpack is supposed to be used. When I have something working can I post my webpack config on the code review stack exchange to get help creating a more idiomatic webpack config?

MrZoraman
  • 421
  • 4
  • 13
  • Have you looked at https://stackoverflow.com/questions/48041902/webpack-not-copying-css-into-dist? Seems like a similar issue. – Karl Galvez May 03 '19 at 01:17

1 Answers1

0
  1. When creating a CSS file, try using MiniCssExtractPlugin to write CSS to a new file import './style.css'; - this should work, but write CSS inline in the head of html.

    { use: [MiniCssExtractPlugin.loader, 'css-loader'] }

  2. For file name pattern: [name].[contenthash].bundle.js

  3. Use HtmlWebpackPlugin for auto updating [contenthash]

     const plugins = () => {  
       const result =  [
       new HtmlWebpackPlugin({
        template: "./index.html", // this file will be used as html and all css/js will be automaticly included
       })
    ]}
    
Cohen
  • 2,375
  • 3
  • 16
  • 35