«Модуль не найден: ошибка: не удается разрешить …» в проекте узла TS Gatsby

#node.js #typescript #docker #webpack

#node.js #машинопись #docker #webpack

Вопрос:

У меня есть папка сервера (узла), расположенная в корне моего проекта, это приложение Gatsby, написанное на Typescript

Вот одна из ошибок:

 #27 27.94 ERROR in ./server/modules/version/index.ts
#27 27.94 Module not found: Error: Can't resolve '../../common/api/cache' in '/build/server/modules/version'
#27 27.94  @ ./server/modules/version/index.ts 7:16-49
#27 27.94  @ ./server/index.ts
  

Модуль, на который он ссылается, это:

 export class StatusCache {
  private _cache: Record<string, CacheObject> = {};
  private options: CacheOptions = {
    expiresMinutes: 3
  };
...
  

и импорт в другой файл import { StatusCache } from "../../common/api/cache";

структура папок интересующей области:

 server
- common
  - api
    - cache (StatusCache class location)
- modules
  - <version>
    - index.ts
  

и, наконец, мой webpack.server.js

 const path = require("path");
const CleanWebpackPlugin = require("clean-webpack-plugin");
const webpack = require("webpack");

const OUTPUT_FOLDER = "dist";

module.exports = env => ({
  entry: "./server/index.ts",
  mode: "production",
  target: "node",
  module: {
    rules: [
      {
        test: /.(tsx|ts)?$/,
        use: [
          {
            loader: "ts-loader",
            options: {
              logInfoToStdOut: true,
              logLevel: "info",
              allowTsInNodeModules: false,
              transpileOnly: true
            }
          }
        ],
        exclude: /node_modules/
      }
    ]
  },
  plugins: [
    new CleanWebpackPlugin(),
    new webpack.IgnorePlugin(/.(test|spec)./)
  ],
  externals: {
    bufferutil: "bufferutil",
    "utf-8-validate": "utf-8-validate",
    "mongodb-client-encryption": "mongodb-client-encryption"
  },
  resolve: {
    extensions: [".tsx", ".ts", ".js"]
  },
  output: {
    filename: "server.js",
    chunkFilename: "[name].bundle.js",
    path: path.resolve(__dirname, OUTPUT_FOLDER),
    publicPath: "/"
  }
});

  

Комментарии:

1. Это файлы кэша. Вы пробовали запускать gatsby clean и gatsby develop ?

2. Мой проект работает нормально локально — он завершается сбоем при сборке сервера в контейнере Docker, который создается с помощью этой команды : webpack --config webpack.server.js . Я не верю, что это обязательно проблема Gatsby

3. Спасибо за пометку Docker — я не подумал добавить его, мой плохой!

Ответ №1:

Я нашел решение, которое сработало для меня и может быть полезным для других.

Я добавил и отредактировал свой tsconfig-server.json к этому:

 {
  "compilerOptions": {
    "baseUrl": "./server",
    "module": "commonjs",
    "esModuleInterop": true,
    "target": "esnext",
    "moduleResolution": "node",
    "sourceMap": true,
    "outDir": "dist",
    "noEmit": false
  },
  "lib": ["es2015"]
}
  

в частности, baseUrl, target и moduleResolution

Ответ №2:

У меня была аналогичная ошибка, проблема была в gatsby-config, мне пришлось добавить свойство ignore следующим образом :

 {
  resolve: `gatsby-source-filesystem`,
  options: {
    name: `data`,
    path: `${__dirname}/src/data/`,
    ignore: [`**/.*`], // ignore files starting with a dot
  },
},