Модуль не найден Ошибка при развертывании на Heroku

Я пытаюсь развернуть свое приложение на Github в Heroku, но получаю сообщение об ошибке:

ОШИБКА в ./src/Index.tsx Модуль не найден: Ошибка: не удается разрешить «./ConfigureStore» в «/app/src» @ ./src/Index.tsx 9:23-50

Похоже на проблему с Typescript при развертывании на Heroku.

Хотя в моей локальной сети работает отлично, а веб-пакет генерирует пакеты, и приложение работает нормально. Ниже мой webpack.config:

const path = require('path');
const webpack = require('webpack');
const merge = require('webpack-merge');
const CheckerPlugin = require('awesome-typescript-loader').CheckerPlugin;
const rootModulePath = "./src/";

module.exports = {
    stats: { modules: false },
    resolve: {
        extensions: ['.js', '.jsx', '.ts', '.tsx', '.css']
    },
    entry: {
        'DIG': rootModulePath + "Index.tsx"
    },
    externals: {
        jQuery: 'jQuery'
      },
      node: {
        fs: 'empty'
      },
    plugins: [
        new webpack.ProvidePlugin({
            '$': 'jquery',
            'jQuery': 'jquery'
          }),
        new webpack.IgnorePlugin(/\.\/locale$/),
        new CheckerPlugin()        
    ],
    devtool: 'source-map',
    output: {
        path: __dirname,
        filename: './public/dig.js'
    },
    module: {
        rules: [
            { test: /\.tsx?$/, include: /src/, use: ['awesome-typescript-loader?silent=true'] },
            //{ test: /\.ts$/, include: /src/, use: 'awesome-typescript-loader?silent=true' },
            { test: /\.html$/, use: 'html-loader?minimize=false' },
            {
                test: /\.less$/,
                use: [{
                    loader: "style-loader" // creates style nodes from JS strings
                }, {
                    loader: "css-loader" // translates CSS into CommonJS
                }, {
                    loader: "less-loader" // compiles Less to CSS
                }]
            },
            { test: /\.css$/, use: ['style-loader','css-loader'] },
            { test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader?limit=25000' }
            // { test: /\.js/, loader: 'imports-loader?define=>false'}
        ]
    }    
};

package.json

{
  "name": "digeratia",
  "version": "1.0.0",
  "description": "",
  "main": "webpack.config.js",
  "scripts": {
    "build": "webpack --mode production",
    "start": "npm run build && node server.js"
  },
  "author": "Vivek Singh",
  "dependencies": {
    "@types/history": "4.6.2",
    "@types/numeral": "0.0.22",
    "@types/react": "16.1.0",
    "@types/react-bootstrap": "^0.32.6",
    "@types/react-dom": "16.0.4",
    "@types/react-hot-loader": "3.0.6",
    "@types/react-redux": "5.0.15",
    "@types/react-router": "4.0.23",
    "@types/react-router-dom": "4.2.6",
    "@types/react-router-redux": "5.0.13",
    "@types/webpack": "4.1.3",
    "@types/webpack-env": "1.13.5",
    "awesome-typescript-loader": "4.0.1",
    "axios": "^0.18.0",
    "bootstrap": "^4.0.0-alpha.6",
    "chai": "^4.1.2",
    "create-react-class": "^15.6.2",
    "datatables.net": "^1.10.16",
    "datatables.net-dt": "^1.10.16",
    "domain-task": "^3.0.3",
    "event-source-polyfill": "0.0.12",
    "express": "^4.16.2",
    "extract-text-webpack-plugin": "3.0.2",
    "file-loader": "1.1.11",
    "history": "4.7.2",
    "html-to-react": "1.3.3",
    "it": "^1.1.1",
    "json-loader": "0.5.7",
    "less": "^3.0.1",
    "less-loader": "^4.0.5",
    "lodash": "^4.17.4",
    "node-noop": "1.0.0",
    "numeral": "^2.0.6",
    "react": "^16.2.0",
    "react-bootstrap": "^0.32.1",
    "react-dom": "^16.2.0",
    "react-element-to-jsx-string": "^13.0.0",
    "react-hot-loader": "4.0.1",
    "react-image": "^1.0.1",
    "react-intl": "^2.4.0",
    "react-moment": "^0.7.0",
    "react-popper": "^0.9.2",
    "react-redux": "5.0.7",
    "react-router-dom": "4.2.2",
    "react-router-redux": "5.0.0-alpha.6",
    "redux": "3.7.2",
    "redux-thunk": "2.2.0",
    "shelljs": "^0.8.1",
    "style-loader": "^0.20.3",
    "to-string-loader": "^1.1.5",
    "typescript": "2.8.1",
    "url-loader": "1.0.1",
    "webpack": "4.4.1",
    "webpack-hot-middleware": "2.21.2",
    "webpack-merge": "4.1.2",
    "xit": "^0.2.0",
    "abort-controller": "^1.0.0",
    "babel-plugin-syntax-optional-chaining": "^7.0.0-alpha.13",
    "babel-runtime": "^6.26.0",
    "core-js": "^2.5.1",
    "css-loader": "^0.28.4",
    "css-to-string-loader": "^0.1.3",
    "react-render-html": "^0.6.0",
    "toastr": "^2.1.2",
    "webpack-cli": "^2.0.12"
  },
  "devDependencies": {
    "abort-controller": "^1.0.0",
    "babel-plugin-syntax-optional-chaining": "^7.0.0-alpha.13",
    "babel-runtime": "^6.26.0",
    "core-js": "^2.5.1",
    "css-loader": "^0.28.4",
    "css-to-string-loader": "^0.1.3",
    "react-render-html": "^0.6.0",
    "toastr": "^2.1.2",
    "webpack-cli": "^2.0.12"
  }
}

URL кода github: здесь

Пожалуйста, помогите, так как я застрял на этом вопросе в течение длительного времени.


person User3250    schedule 02.04.2018    source источник


Ответы (5)


Так что проблема не в том, что вы написали. Проблема устранена, поскольку вы предполагаете, что Index.ts или Index.tsx эквивалентны index.ts или index.tsx. Если вы посмотрите на ветку ниже

webpack: нормально на MacOS, ошибки загрузчика на linux

Это объясняет, что при сборке на Mac вы не столкнетесь с проблемой. И я предполагаю тот же случай с Windows. Но с Linux вы столкнетесь с проблемой. Вот что здесь происходит. Если вы ssh к коробке heroku

$ heroku ps:exec
Establishing credentials... done
Connecting to web.1 on ⬢ sleepy-sea-65699...
~ $ webpack -p --verbose
Hash: 8c20236f8268ce043077
Version: webpack 3.10.0
Time: 24904ms
            Asset     Size  Chunks                    Chunk Names
    ./docs/dig.js   608 kB       0  [emitted]  [big]  DIG
./docs/dig.js.map  4.25 MB       0  [emitted]         DIG
Entrypoint DIG [big] = ./docs/dig.js ./docs/dig.js.map
chunk    {0} ./docs/dig.js, ./docs/dig.js.map (DIG) 1.38 MB [entry] [rendered]
...
...
ERROR in ./src/configureStore.ts
Module not found: Error: Can't resolve './Stores' in '/app/src'
resolve './Stores' in '/app/src'
  using description file: /app/package.json (relative path: ./src)
    Field 'browser' doesn't contain a valid alias configuration
  after using description file: /app/package.json (relative path: ./src)
    using description file: /app/package.json (relative path: ./src/Stores)
      no extension
        Field 'browser' doesn't contain a valid alias configuration
        /app/src/Stores is not a file
      .js
        Field 'browser' doesn't contain a valid alias configuration
        /app/src/Stores.js doesn't exist
      .jsx
        Field 'browser' doesn't contain a valid alias configuration
        /app/src/Stores.jsx doesn't exist
      .ts
        Field 'browser' doesn't contain a valid alias configuration
        /app/src/Stores.ts doesn't exist
      .tsx
        Field 'browser' doesn't contain a valid alias configuration
        /app/src/Stores.tsx doesn't exist
      .css
        Field 'browser' doesn't contain a valid alias configuration
        /app/src/Stores.css doesn't exist
      as directory
        existing directory
          using path: /app/src/Stores/index
            using description file: /app/package.json (relative path: ./src/Stores/index)
              no extension
                Field 'browser' doesn't contain a valid alias configuration
                /app/src/Stores/index doesn't exist
              .js
                Field 'browser' doesn't contain a valid alias configuration
                /app/src/Stores/index.js doesn't exist
              .jsx
                Field 'browser' doesn't contain a valid alias configuration
                /app/src/Stores/index.jsx doesn't exist
              .ts
                Field 'browser' doesn't contain a valid alias configuration
                /app/src/Stores/index.ts doesn't exist
              .tsx
                Field 'browser' doesn't contain a valid alias configuration
                /app/src/Stores/index.tsx doesn't exist
              .css
                Field 'browser' doesn't contain a valid alias configuration
                /app/src/Stores/index.css doesn't exist

Как видите, файл с ошибкой имеет номер index, а не Index.

Также, если вы проверите конфигурацию репо

$ cat .git/config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true

Вы можете видеть, что ignorecase установлено на true, что нехорошо, потому что тогда git не будет смотреть на переименования файлов и изменения случаев и нажимать переименованные файлы.

Таким образом, по сути, ошибка заключается в том, что ваш Index.ts должен index.ts сделать вашу сборку кросс-ОС совместимой.

Плагин с учетом регистра

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

$ npm install --save-dev case-sensitive-paths-webpack-plugin

> [email protected] install /Users/tarun.lalwani/Desktop/tarunlalwani.com/tarunlalwani/workshop/ub16/so/DigeratiGlobalReact/node_modules/fsevents
> node install

[fsevents] Success: 
+ [email protected]
added 117 packages from 85 contributors and removed 3 packages in 9.661s

Обновите webpack.config.js, как показано ниже.

const path = require('path');
const webpack = require('webpack');
const merge = require('webpack-merge');
const CheckerPlugin = require('awesome-typescript-loader').CheckerPlugin;
const rootModulePath = "./src/";
const rootBundlePath = "./src/bundle/";
const isDevBuild = true;
var CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin');


module.exports = {
    stats: { modules: false },
    resolve: {
        extensions: ['.js', '.jsx', '.ts', '.tsx', '.css']
    },
    entry: {
        'DIG': rootModulePath + "Index.tsx"
    },
    externals: {
        jQuery: 'jQuery'
      },
      node: {
        fs: 'empty'
      },
    plugins: [
        new CaseSensitivePathsPlugin(),
        new webpack.ProvidePlugin({
            '$': 'jquery',
            'jQuery': 'jquery'
          }),
 ....

Теперь при сборке вы увидите эти проблемы непосредственно в Windows/Mac.

sh-3.2$ npm run build

> [email protected] build /Users/tarun.lalwani/Desktop/tarunlalwani.com/tarunlalwani/workshop/ub16/so/DigeratiGlobalReact
> webpack -p

Hash: 3762a6deb22d9fabd37b
Version: webpack 3.10.0
Time: 12279ms
            Asset     Size  Chunks                    Chunk Names
    ./docs/dig.js   511 kB       0  [emitted]  [big]  DIG
./docs/dig.js.map  3.56 MB       0  [emitted]         DIG

ERROR in ./src/configureStore.ts
Module not found: Error: [CaseSensitivePathsPlugin] `/Users/tarun.lalwani/Desktop/tarunlalwani.com/tarunlalwani/workshop/ub16/so/DigeratiGlobalReact/src/Stores/index.ts` does not match the corresponding path on disk `Index.ts`.
 @ ./src/configureStore.ts 6:15-34
 @ ./src/Index.tsx
npm ERR! code ELIFECYCLE
npm ERR! errno 2
person Tarun Lalwani    schedule 06.04.2018
comment
Потрясающий! Спасибо, что покопались. Итак, в конце концов, дело в корпусе. Однако у меня есть вопрос, поэтому, когда я выполнял импорт каталога, например ./Stores, и игнорировал индекс, это должно было сработать, потому что тогда не было никаких проблем с регистром. - person User3250; 06.04.2018
comment
Какую ОС вы используете? - person Tarun Lalwani; 06.04.2018
comment
У меня окна. Это не сработало на Heroku, когда я попытался импортировать каталог - person User3250; 06.04.2018
comment
Вам нужно переименовать каждый Index.ts в index.ts, и тогда он заработает на Heroku. Также вам следует использовать новое репо сейчас, чтобы избежать проблемы с конфигурацией ignorecase и испортить историю. Я бы предложил начать с нового репо и не включать ignorecase в конфигурации git. - person Tarun Lalwani; 06.04.2018
comment
Также вы должны добавить плагин, чтобы убедиться, что такие вещи не повторятся в будущем. .com/Urthen/с учетом регистра-пути-webpack-plugin - person Tarun Lalwani; 06.04.2018

Ваш файл называется configureStore, а вы пытаетесь импортировать ConfigureStore, он должен быть в нижнем регистре "c".

Он работает на вашем компьютере, но Heroku чувствителен к регистру.

person Nir Ben-Yair    schedule 02.04.2018
comment
Не работает. Я уже думал об этом.. :( - person User3250; 02.04.2018

У меня это работает. Кажется, на Heroku Импорт каталога не работает .

Следовательно, когда я уточнил свой импорт с помощью «Index.ts» или «Index.tsx», пакет был создан идеально, и приложение начало работать, как показано ниже:

От

import * as Store from './ConfigureStore'

Кому

import * as Store from './ConfigureStore/Index';

Может кому пригодится в будущем.

person User3250    schedule 05.04.2018
comment
Я развернул ваш репозиторий Git, и он работал без проблем на героку? - person Tarun Lalwani; 06.04.2018
comment
@TarunLalwani Да, репозиторий Git обновлен с учетом вышеуказанных изменений. Следовательно, это работает. - person User3250; 06.04.2018
comment
Можете ли вы предоставить коммит, где он не работал? Хотелось бы посмотреть с другого ракурса - person Tarun Lalwani; 06.04.2018
comment
@TarunLalwani Не могли бы вы попробовать удалить ''./Stores/Index';' из файла «configureStore», а затем развернуть в Heroku? Тогда вы должны получить ошибку. - person User3250; 06.04.2018
comment
Смотрите объяснение и ответ, который я разместил - person Tarun Lalwani; 06.04.2018

Является ли отсутствующий модуль зависимостью от разработчиков? В таком случае вы не увидите никакой проблемы локально, пока Heroku не установит dev-зависимости, и вы получите ошибку «Модуль не найден». Чтобы это исправить, просто удалите dev-зависимость и переустановите модуль с флагом --save.

person Nati Kamusher    schedule 07.04.2020
comment
Нет, не связано с зависимостью разработчиков. Это была проблема с корпусом - person User3250; 08.04.2020

Я почему-то добавил это

"heroku-prebuild": "export NPM_CONFIG_PRODUCTION=false; export NODE_ENV=; NPM_CONFIG_PRODUCTION=false NODE_ENV=development npm install --only=dev --dev",
"heroku-postbuild": "export NPM_CONFIG_PRODUCTION=true; export NODE_ENV=production;

Я получил это из этого ответа

по умолчанию heroku удаляет ваши пакеты из раздела devDependencies после сборки. Возможно, что-то в вашем приложении зависит от пакетов, указанных в devDependencies. Приведенные выше сценарии npm пропускают очистку devDependencies.

person The.Wolfgang.Grimmer    schedule 03.10.2020