부트캠프/따로 공부

webpack 빌드 시 이미지 경로(assets, 템플릿 로더)

하이고니 2023. 3. 20. 16:58

 

만들어뒀던 js, css, html 기반 프로젝트를 webpack으로 번들링하고 있었다.

다른 건 잘 되는데, asset 폴더 경로를 지정해서 png나 jpg 파일을 불러오려고 하는 것에서 문제가 발생했다.

 

<!DOCTYPE html>
<html lang="en">
  <head>
		<!-- ... -->
  </head>

  <body>
    
    
		<!-- ... -->
        
      <img src="./jerry.png")> alt="" id="jerry" />
      
		<!-- ... -->
        
  </body>
</html>

 

저렇게 상대 경로로 설정해두고 빌드하면 경로가 바뀌지 않아서 파일은 정상적으로 따라와도 html이 png 파일을 읽을 수가 없다.

아래는 webpack.config.js 파일 내용이다.

 

const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");

module.exports = {
  entry: "./src/index.js",
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "app.bundle.js",
    
    // png 파일이 저장될 경로
    assetModuleFilename: 'assets/[name][ext]',
    
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ["style-loader", "css-loader"],
        exclude: /node_modules/,
      },
      
      
      // asset 관련
      {
        test: /\.png$/,
        type: 'asset',
        parser: {
          dataUrlCondition: {
            maxSize: 4 * 1024,
          }
        },
      },
      
      
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, "src", "index.html"),
    }),


  ],
};

 

 

빌드가 되면 dist 폴더가 생성되고, 그 안에 assets 폴더가 만들어지며, 그 안에 png 파일이 들어갈 것이다.

 

 

빌드 후 경로

 

 

HTML도 그에 따라 경로가 바뀌어야 하는데, HTML은 그냥 텍스트일 뿐이라서 빌드함에 따라 변하고 자시고 하지 않는다.

그럼 그 경로를 바뀌게 하려면?

 

<img src="<%= require('./jerry.png') %>" alt="" id="jerry" />

 

저런 요상한 문법을 사용하면 된다. '템플릿 로더'라고 하는 건데 알아서 assets 파일 내를 가리키게 해준다.

저렇게 쓰고 빌드하면,

 

빌드 후 dist 폴더 내 html 파일

 

경로가 잘 바뀐 것을 확인할 수 있다.