iT邦幫忙

0

webpack打包後 在container內找不到module

專案使用typescript並用webpack打包

本地端直接使用nodemon可以正確執行
使用webpack打包後可以使用node index.min.js執行
但是打包成docker image後卻無法正確運行container

node:internal/modules/cjs/loader:944
  throw err;
  ^

Error: Cannot find module 'dotenv/config'
Require stack:
- /src/index.min.js
    at Function.Module._resolveFilename (node:internal/modules/cjs/loader:941:15)
    at Function.Module._load (node:internal/modules/cjs/loader:774:27)
    at Module.require (node:internal/modules/cjs/loader:1013:19)
    at require (node:internal/modules/cjs/helpers:93:18)
    at Object.1201 (/src/index.min.js:1:136901)
    at a (/src/index.min.js:1:137375)
    at Object.7728 (/src/index.min.js:1:135220)
    at a (/src/index.min.js:1:137375)
    at /src/index.min.js:1:137415
    at Object.<anonymous> (/src/index.min.js:1:137423) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ '/src/index.min.js' ]
}
  • webpack設定檔
const path = require('path');
const webpack = require('webpack');
const nodeExternals = require('webpack-node-externals');

module.exports = {
  target: 'node',
  mode: 'production',
  entry: './src/server.ts',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'index.min.js',
  },
  optimization: {
    // minimize: false,
  },
  resolve: {
    // Add `.ts` and `.tsx` as a resolvable extension.
    extensions: ['.ts', '.tsx', '.js'],
  },
  externals: [nodeExternals(), 'pg', 'sqlite3', 'tedious', 'pg-hstore', 'dotenv/config'],
  plugins: [
    new webpack.ContextReplacementPlugin(/Sequelize(\\|\/)/, path.resolve(__dirname, './src')),
  ],
  module: {
    rules: [
      // all files with a `.ts` or `.tsx` extension will be handled by `ts-loader`
      { test: /\.tsx?$/, loader: 'ts-loader' },
    ],
  },
};
  • dockefile
FROM node:current-alpine3.12
RUN mkdir /src
COPY dist /src
COPY .env /src
WORKDIR /src
CMD ["node","index.min.js"]
  • tsconfig
{
  "compilerOptions": {
    "strict": true,
    "esModuleInterop": true,
    "outDir": "build"
  }
}

原本以為是dotenv/config的問題

改用

require('dotenv/confit).require()

之後卻又變成找不到express

有前輩遇過類似的問題嗎?

看更多先前的討論...收起先前的討論...
DanSnow iT邦研究生 5 級 ‧ 2021-05-18 10:40:47 檢舉
你加上 nodeExternals 就一定會遇到這個問題啊,因為加上這個的意思就是不要打包相依的套件,要嘛你在 container 裡也安裝這些套件,要嘛就拿掉這個設定,讓它全打包
skycover iT邦新手 5 級 ‧ 2021-05-18 11:46:01 檢舉
感謝回應

會加上這一行是因為之前遇到執行時有
Please install sqlite3 package manually 的問題
當時找到有解法是加上nodeExternals
沒注意他實際上的意思

那想請問如果今天不加上nodeExternals 的話
有什麼方式可以處理在專案內沒有import導致webpack並未將相依的套件打包的問題

謝謝
DanSnow iT邦研究生 5 級 ‧ 2021-05-18 13:12:53 檢舉
`sqlite3` 看來是一定要 external ,所以大概就是在 external 加上 `sqlite3` ,然後其它的打包,之後在 container 裡安裝 `sqlite3` ,不過為什麼你要打包呢?因為在 container 裡安裝相依性也行啊
DanSnow iT邦研究生 5 級 ‧ 2021-05-18 13:15:15 檢舉
跑在 Node.js 的程式不一定會讓你好打包,有時要花上不少時間調整設定才有辦法成功打包的
skycover iT邦新手 5 級 ‧ 2021-05-18 14:09:08 檢舉
會想打包的原因是希望不要整包node_modules都放進docker image裡面
請問現在業界包node的image時都是在裡面做install嗎
DanSnow iT邦研究生 5 級 ‧ 2021-05-18 14:55:04 檢舉
看情況,如果是純 js 而且用到的套件支援 es6 的話,我個人是比較喜歡打包的,不過如果你要在 container 裡安裝的話,建議你看一個東西叫 multi-stages build ,它可以讓你包出來的 image 只有必要的東西,不會有中間安裝的暫存檔之類的
skycover iT邦新手 5 級 ‧ 2021-05-18 15:45:33 檢舉
好的 感謝
看錯問題 自刪

尚未有邦友回答

立即登入回答