카테고리 없음

webpack 공부 시작

스마트큐브 2021. 7. 1. 13:12

SEO 이슈로 인해 모든 웹페이지에 대한 속도 이슈가 발생해서 사용하지 않는 CSS/JS 를 제거 하고 Minify 해야하는 상황이다. 

막연하게 webpack이 이 문제를 해결해 줄것 같은 희망에 이렇게 시작한다. 

이미 몇개의 유튜브 동영상을 찾아보고 따라해봤는데  여전히 현재 Node + EJS 로 되어있는 페이지를 

어떻게 적용하면 원하는 결과를 얻을수 있을지 잘 모르겠다. ㅠㅠ 

자 일단 이것 부터 차근차근보자 
https://www.youtube.com/watch?v=3On5Z0gjf4U

동영상은 10개 짜리지만  익숙해지는데에는 5~6일 걸린다고 한다.  웹팩이 어렵다고 하는데 

정말 5~6일 해서 익숙해지면 좋것다. 

 

1. 난 ejs 를 사용하는중이다. 따라서 EJS 의 include 에 대한 처리가 필요하다  

   결론 : 이것저것 시도 해봤지만 그냥 EJS 구문은 그냥 무시하고 
   기존처럼 서버 렌터링 타이밍에 해석되도록 그냥 두는게 나은것 같다 

2.  그럼 EJS 에 대한 output 경로와  js 에 대한  output 경로가 달랐으면 좋겠다  예를들어 처리된  index.html 은 views/ 아래 ,   index.js 는  public/dist 아래에 

 결론 :  이렇게 지정하니 해결 됨.

  output: {
    filename: "[name].js",
    path: path.resolve(__dirname, "public/dist")
  },
  plugins: [
    new HtmlWebpackPlugin({
      inject : "body",      // HTML body 태그 하단에 위치하도록 지정 
      template: "./src/template.ejs",
      filename: "../../views/[name].bundle.ejs"
    })
  ],

 

3. 막상 해보니 ejs 파일에  스크립트가 insert 될때 경로( src="../public/dist/... 이런식) 가 썩 맘에 들지 않는다 ,

결론 : 찾아보니  publicPath 란 녀석이 이 문제를 해결해준다  난 dist/ 로 설정되기를 희망하니 

 output: {
    filename: "[name].js",
    path: path.resolve(__dirname, "public/dist"),
    publicPath: '/dist/'
  },

요롷게 셋팅하니 

원하는 대로 설정되었다. 

 

4. 이제 기존 util 처럼 사용하던 js 파일들을 모듈화 해야한다.

하지만 개념이 부족한것 같다. 공부시작! 
참고 :  모듈 내보내기

 

모듈 내보내고 가져오기

 

ko.javascript.info

; 보다 보니  영상에서는 require 를 사용했는데  링크에서는 import 를 사용하고 있다. 
차이를 알아보니 require 는 node.js 에서 사용가능하고  import는 ES6 모듈이라고 한다.   require 는 파일 어디에서나 호출 가능하고 import 는 파일의 서두에서만 호출이 가능하다고 한다.  또한 import는  필요한 모듈만 선택적으로 불러올수 있어서 메모리를 아낄수 있다고 한다.   아! 그래서 링크에서  예제로 설명을 한게 딱 그거에 맞는 설명이였네 . 
차이 설명 링크 

클래스 처리하는 방법 

결론 : 일단 링크에서 처럼 기존 함수 선언들에 export 를 붙여두는 걸로 두는걸로 시작해보자.

5. 가급적 페이지를 최대한 가볍게 하기위해 JQuery 를 제거 해야한다. 

클래스 제어하기     사용자 함수처리 하기 

Ready 함수 

 

Running code when the document is ready

Running code when the document is ready A page can't be manipulated safely until the document is "ready." Here's how to make sure code isn't run prematurely. This function is the equivalent of jQuery's $(document).ready() method: document.addEventListener

plainjs.com

 

6. 이제 CSS 를 모듈화 해야하는데 에러나 나기 시작하고 있다. 

제길슨 이거 진짜 웹팩을 프로젝트 시작부터 고려하고 작업을 한게 아니고서는 정말 쉽지 않은것 같다. 

일단 발생한 문제는 css 파일내에서 참조하고 있는 이미지가 말썽인 상황.