2017-05-04 10 views
9

したがって、私はReactでアプリケーションを作成しています。その後、それをHerokuにデプロイしています。すべてがローカルホストでうまく動作し、エラーもなく、webpackもエラーなしでコンパイルされます。私はHerokuでもenv varialesを設定しています。展開時にHerokuで「モジュールが見つかりません」というエラーが表示される

: - しかし

、私はHerokuのにデプロイするとき、私は空白の画面やコンソールでこのエラーを取得します(それが問題なくローカルホストで動作し、インポートなど私はきちんとTodoApiを必要としていますし、さまざまな方法を試してみました)

私は数日間それを把握しようとしているので、どんな助けも大歓迎です。ここで

Uncaught Error: Cannot find module "TodoApi" 
    at bundle.js:20 
    at Object.<anonymous> (bundle.js:20) 
    at t (bundle.js:1) 
    at Object.<anonymous> (bundle.js:20) 
    at t (bundle.js:1) 
    at Object.<anonymous> (bundle.js:3) 
    at Object.<anonymous> (bundle.js:3) 
    at t (bundle.js:1) 
    at Object.<anonymous> (bundle.js:1) 
    at t (bundle.js:1) 

は私のWebPACKとpackage.jsonファイルです:

var webpack = require('webpack'); 
var path = require('path'); 
var envFile = require('node-env-file'); 

process.env.NODE_ENV = process.env.NODE_ENV || 'development'; 

try { 
    envFile(path.join(__dirname, 'config/' + process.env.NODE_ENV + '.env')); 
} catch(e) { 

} 

module.exports = { 
    entry: [ 
    'script!jquery/dist/jquery.min.js', 
    'script!foundation-sites/dist/js/foundation.min.js', 
    './app/app.jsx' 
    ], 
    externals: { 
     jquery: 'jQuery' 
    }, 
    plugins: [ 
     new webpack.ProvidePlugin({ 
      '$': 'jquery', 
      'jQuery': 'jquery' 
     }), 
     new webpack.optimize.UglifyJsPlugin({ 
      compressor: { 
       warnings: false 
      } 
     }), 
     new webpack.DefinePlugin({ 
     'process.env': { 
      NODE_ENV: JSON.stringify(process.env.NODE_ENV), 
      API_KEY: JSON.stringify(process.env.API_KEY), 
      AUTH_DOMAIN: JSON.stringify(process.env.AUTH_DOMAIN), 
      DATABASE_URL: JSON.stringify(process.env.DATABASE_URL), 
      STORAGE_BUCKET: JSON.stringify(process.env.STORAGE_BUCKET), 
      MESSAGING_SENDER_ID: JSON.stringify(process.env.MESSAGING_SENDER_ID) 
     } 
     }) 
    ], 
    output: { 
    path: __dirname, 
    filename: './public/bundle.js' 
    }, 
    resolve: { 
    root: __dirname, 
    modulesDirectories: [ 
     'node_modules', 
     './app/components', 
     './app/api' 
    ], 
    alias: { 
     app: 'app', 
     applicationStyles: 'app/styles/app.scss', 
     actions: 'app/actions/actions.jsx', 
     reducers: 'app/reducers/reducers.jsx', 
     configureStore: 'app/store/configureStore.jsx' 
    }, 
    extensions: ['', '.js', '.jsx'] 
    }, 
    module: { 
    loaders: [ 
     { 
     loader: 'babel-loader', 
     query: { 
      presets: ['react', 'es2015', 'stage-0'] 
     }, 
     test: /\.jsx?$/, 
     exclude: /(node_modules|bower_components)/ 
     } 
    ] 
    }, 
    devtool: process.env.NODE_ENV === 'production' ? undefined : 'cheap-module-eval-source-map' 
}; 


{ 
    "name": "reactapp", 
    "version": "1.0.0", 
    "description": "ReactApp", 
    "main": "index.js", 
    "scripts": { 
    "test": "NODE_ENV=test karma start", 
    "build": "webpack", 
    "start": "npm run build && node server.js" 
    }, 
    "author": "John Smith", 
    "license": "MIT", 
    "dependencies": { 
    "axios": "^0.16.0", 
    "babel-core": "^6.5.1", 
    "babel-loader": "^6.2.2", 
    "babel-preset-es2015": "^6.5.0", 
    "babel-preset-react": "^6.5.0", 
    "babel-preset-stage-0": "^6.5.0", 
    "css-loader": "^0.23.1", 
    "deep-freeze-strict": "^1.1.1", 
    "expect": "^1.20.2", 
    "express": "^4.13.4", 
    "firebase": "^3.9.0", 
    "foundation-sites": "^6.3.1", 
    "jquery": "^2.2.1", 
    "moment": "^2.18.1", 
    "node-env-file": "^0.1.8", 
    "node-sass": "^4.5.2", 
    "react": "^0.14.7", 
    "react-addons-test-utils": "^0.14.6", 
    "react-dom": "^0.14.7", 
    "react-redux": "^5.0.4", 
    "react-router": "^2.0.0", 
    "redux": "^3.6.0", 
    "redux-mock-store": "^1.2.3", 
    "redux-thunk": "^2.2.0", 
    "sass-loader": "^6.0.3", 
    "script-loader": "^0.6.1", 
    "style-loader": "^0.13.0", 
    "uuid": "^3.0.1", 
    "webpack": "^1.12.13" 
    }, 
    "devDependencies": { 
    "karma": "^0.13.22", 
    "karma-chrome-launcher": "^0.2.3", 
    "karma-mocha": "^0.2.2", 
    "karma-mocha-reporter": "^2.2.3", 
    "karma-sourcemap-loader": "^0.3.7", 
    "karma-webpack": "^1.8.1", 
    "mocha": "^2.5.3" 
    } 
} 

var React = require('react'); 
var { connect } = require('react-redux'); 
import Todo from 'Todo'; 
var TodoApi = require('TodoApi'); 

export var TodoList = React.createClass ({ 
    render: function() { 
     var { todos, showCompleted, searchText } = this.props; 
     var renderTodos =() => { 
      var filteredTodos = TodoApi.filterTodos(todos, showCompleted, searchText); 

      if(filteredTodos.length === 0) { 
       return (
        <p className="container__message">No tasks</p> 
       ); 
      } 
      return filteredTodos.map((todo) => { 
       return (
        //add unique key prop to keep track of individual components 
        <Todo key={todo.id} {...todo} /> 
       ); 
      }); 
     }; 
     return (
      <div> 
       {renderTodos()} 
      </div> 
     ); 
    } 
}); 

export default connect(
    (state) => { 
     return state; 
    } 
)(TodoList); 
+2

はTodoApiの外付けパッケージですか? –

+1

どのO.S.あなたのローカルホストですか? – Dez

答えて

0

あなたはTodoApiを必要としているが、このパッケージには、あなたのTodoList.jsxコンポーネント

では、あなたのpackage.json

には存在しません。 var TodoApi = require("TodoApi");

レポをすばやく見れば、パッケージはどこにも存在しないことがわかります。

+0

私は後でそれを含めましたが、問題は残っていますので、アプリケーションはlocalhostで動作します。これはHerokuに展開すると発生します。私は投稿を編集し、現在のTodoListコンポーネントを含めました。だから、TodoApiはapiフォルダのjsxファイルです – Smithy

+1

さて、問題はあなたが 'TodoApi'へのパスを指定する必要があることです。 'var TodoApi = require(' ../ api/TodoApi ')' –

+0

ありがとうございます。しかし、私はそれをすべてのバリエーション、インポート、そして様々なパスから試してみましたが、これは問題ではないようです。悪いパスの場合、私はアプリケーションがローカルホスト上ですぐに壊れるだろうと思っています....私は多分ステージ1と最新のバベルプリセットを試してみるべきだと思っていましたが、私はいつも同じエラーが発生します。私の推測では、それはHerokuと何か関係があり、パスをどのように読んでいるのでしょうか、多分npmモジュールをローカルマシンとは違って扱います...? – Smithy

0

あなたの問題は、ウェブパック設定ファイルのresolve部分にあると思います。 Herokuに展開すると、resolve.modulesDirectoriesが正しく機能しないようです。私はあなたの './app/components'と './app/api'をresolve.modulesDirectoriesの代わりにresolve.rootで解決するように設定するのがより理にかなっていると感じています。したがって、resolve設定に従って試してみてください。これはおそらくHerokuで動作します。

resolve: { 
    root: [ 
     __dirname, 
     path.resolve(__dirname, "app/components"), 
     path.resolve(__dirname, "app/api") 
    ], 
    modulesDirectories: [ 'node_modules' ], 
    alias: { 
     app: 'app', 
     applicationStyles: 'app/styles/app.scss', 
     actions: 'app/actions/actions.jsx', 
     reducers: 'app/reducers/reducers.jsx', 
     configureStore: 'app/store/configureStore.jsx' 
    }, 
    extensions: ['', '.js', '.jsx'] 
} 
+0

が試しましたが、まだ同じ... – Smithy

0

問題はまさにその問題です。 TodoApi。

TodoApiがおそらく "node_modules"ディレクトリにあるため、ローカルで動作します。 (あなたはあなたのindex.htmlにあなたをローカルに含めませんでしたか?)問題は、それがデプロイメントパッケージにパックされていないことです。それがうまくいかない理由です。あなたが気づいた場合

まず、知らないけど、あなたは再びそれを除外node_modules下modulesDirectories以降の下module.loadersを含める(にwan't)。幸いにもあなたのためにそれは含まれていませんでした。さもなければ、あなたはまだ建築されるでしょう、笑。それ以外には、モジュールのディレクトリを削除することができます。また、node_modulesをディレクトリに含めることをお勧めします。 ;)

私はいくつかの構造を持たせるために、何が含まれているのか分からないのかを明確に見ることができます。あなたの上にあるwebpackはいくつかの絶対ディレクトリを定義しています:

// Absolute directories 
const root = (...dir) => path.resolve(__dirname, ...dir); 
const lib  = root('lib'), 
     src  = root('src'), // or 'app' 
     project = root('.'); 

これはあなたがどのディレクトリが割り当てられていて読みやすいかを知っています。 次に、エントリファイルを設定します。

const entry = root('app/app.jsx'); 

とモジュールの下でそれを変更輸出:私はいつもこれまでのWebPACK懸念しているsrcがトップディレクトリであることを意味私のsrcディレクトリにコンテキストを設定

root: src, 
context: src, 
entry: entry, 
... 

。エントリー中の他のものを取り除く。

まだビルド作業をしていないうちにUglifyプラグインをコメントアウトします。独自のエラーを作成できるものを除外します。

ウェブパックバンドルアナライザをインストールしてください。

npm i --save-dev webpack-bundle-analyzer 

そして、このようなあなたのWebPACKプラグインに追加します。

 new BundleAnalyzerPlugin({ 
     analyzerMode: 'server', 
     analyzerHost: 'localhost', 
     analyzerPort: 9002, 
     reportFilename: 'report.html', 
     openAnalyzer: true, 
     // Log level. Can be 'info', 'warn', 'error' or 'silent'. 
     logLevel: 'info' 
     }) 

これは、ビルド後のあなたのパッケージの素敵なグラフィカルなビューを開きます。ブロックの1つに「TodoApi」と言及する必要があります。コードを変更せずに最初にBundleAnalyzerPluginを追加すると、TodoApiがおそらくそこにないことがわかります。

+0

p.s.開発に使用される多くのモジュールはあなたの依存関係にあり、devDependenciesになければなりません。 (例えば、ローダ、テスト、サス等)。あなたは本当にきれいにして、あなたが働いているものをチェックするべきです。良いクリーンな構造とコードスタイルで始めることはあなたの時間を固定するものです。 – stevenvanc

関連する問題