Contents

[JS]Knex와 Webpack을 같이 쓰면서 발생한 오류 처리

Contents
ERROR in './node_modules/knex/lib/dialects/mssql/index.js'
Module not found: Error : Can't resolve 'mssql/lib/base'

프로젝트에 웹팩을 도입하여 사용중, knex 라이브러리를 넣고 나서 웹팩으로 빌드시 해당 에러가 나와서 빌드에 실패 했습니다.

해당 오류를 검색 하였는데, 역시나 깃허브 이슈가 있었고(감사합니다), webpack의 config에 아래의 내용을 추가 하였습니다.

  externals: {
    knex: 'commonjs knex'
  }

해당 작업 후 빌드는 성공했지만, 노드 서버에서 실행시 knex 모듈을 찾을 수 없다는 오류가 나왔습니다.

{
  "errorMessage": "Cannot find module 'knex'",
  "errorType": "Error",
  "stackTrace": [
    "Function.Module._load (module.js:474:25)",
    "Module.require (module.js:596:17)",
    "require (internal/module.js:11:18)",
    "Object.defineProperty.value (/var/task/main.js:1604:18)",
    "__webpack_require__ (/var/task/main.js:20:30)",
    "Object.<anonymous> (/var/task/main.js:1564:14)",
    "__webpack_require__ (/var/task/main.js:20:30)",
    "Object.defineProperty.value (/var/task/main.js:1442:20)",
    "__webpack_require__ (/var/task/main.js:20:30)"
  ]
}

계속해서 구글링하던중, 다른분의 도움으로 해당 이슈 코멘트를 찾았습니다. 해당 코드를 참고하여 mysql2 라이브러리를 사용했기때문에 아래와 같은 코드를 추가 하였습니다.

{
  plugins: [
    new webpack.NormalModuleReplacementPlugin(/\.\.migrate/, '../util/noop.js'),
    new webpack.NormalModuleReplacementPlugin(/\.\.seed/, '../util/noop.js'),
    new webpack.IgnorePlugin(/mariasql/, /knex/),
    new webpack.IgnorePlugin(/mysql/, /knex/),
    new webpack.IgnorePlugin(/mssql/, /knex/),
    new webpack.IgnorePlugin(/oracle/, /knex/),
    new webpack.IgnorePlugin(/oracledb/, /knex/),
    new webpack.IgnorePlugin(/postgres/, /knex/),
    new webpack.IgnorePlugin(/redshift/, /knex/),
    new webpack.IgnorePlugin(/pg-query-stream/, /knex/),
    new webpack.IgnorePlugin(/sqlite3/, /knex/),
    new webpack.IgnorePlugin(/strong-oracle/, /knex/),
    new webpack.IgnorePlugin(/pg-native/, /pg/)
  ]
}

빌드는 성공 했으나 정상 동작하지 않아 확인 해보니 /node_modules/knex/lib/mysql2/index.js 해당 파일에

/node_modules/knex/lib/mysql2/index.js

이러한 코드가 있어서 결국 mysql2를 쓰더라도 mysql 라이브러리가 필요하였습니다.

굳이 mysql2 모듈을 고집 할 필요가 없을것 같아, mysql 모듈로 변경하고, new webpack.IgnorePlugin(/mysql/, /knex/)new webpack.IgnorePlugin(/mysql2/, /knex/), 로 변경하니 빌드도 성공하였으며, 정상 동작 하였습니다.

더 좋은 방법이 있을거 같은데 아쉽게도 제가 찾은 방법은 이것 밖에 없었습니다. 좋은 해결 방안 있으면 댓글로 공유 부탁 드리겠습니다.