2017-02-05 4 views
-1

Ниже мой server.js файл:/src/bundle.js не найден в реакцию с применением WebPack

import path from 'path'; 
import express from 'express'; 
import webpack from 'webpack'; 
import middleware from './src/middleware'; 

const app = express(); 
var port  = process.env.PORT || 8080; 

if(process.env.NODE_ENV === 'development') { 
const config = require('./webpack.config.dev'); 
const compiler = webpack(config); 
app.use(require('webpack-dev-middleware')(compiler, { 
    noInfo: true, 
    publicPath: config.output.publicPath, 
    stats: { 
     assets: false, 
     colors: true, 
     version: false, 
     hash: false, 
     timings: false, 
     chunks: false, 
     chunkModules: false 
    } 
})); 
//app.use(require('webpack-hot-middleware')(compiler)); 
app.use(express.static(path.resolve(__dirname, 'src'))); 
} else if(process.env.NODE_ENV === 'production') { 
app.use(express.static(path.resolve(__dirname, 'dist'))); 
} 

app.get('*', middleware); 

app.listen(port, '0.0.0.0', (err) => { 
if(err) { 
    console.error(err); 
} else { 
    console.info(path.resolve(__dirname, 'src')); 
    console.info('Listening at '+port); 
} 
}); 

Моего webpack.config.dev.js:

const path = require('path'); 
const webpack = require('webpack'); 

module.exports = { 
entry: './src/middleware.js', 
output: { 
path  : path.resolve('./src'), // always use absolute paths 
filename : 'bundle.js', 
publicPath : '/assets/' 
}, 
plugins: [ 
    new webpack.HotModuleReplacementPlugin(), 
    new webpack.NoErrorsPlugin(), 
    new webpack.DefinePlugin({ 
     'process.env': { 
      NODE_ENV: JSON.stringify('development') 
     } 
    }) 
], 
module: { 
    loaders: [ 
     { 
      test: /\.css$/, 
      loader: 'style-loader' 
     }, { 
      test: /\.css$/, 
      loader: 'css-loader', 
      include: path.join(__dirname, 'node_modules'), 
      query: { 
       modules: true, 
       localIdentName: '[name]__[local]___[hash:base64:5]' 
      } 
     }, 
     { 
      test: /\.js$/, 
      loader: 'babel', 
      include: path.resolve(__dirname, 'src'), 
      query: { 
       presets: [ 'react-hmre' ] 
      } 
     }, 
     { test: /\.js$/, exclude: /node_modules/, loader: "babel-loader" } 
    ] 
    } 
}; 

Это мой промежуточный слой:

import React from 'react'; 
import { renderToString } from 'react-dom/server'; 
import { createStore } from 'redux'; 
import { Provider } from 'react-redux'; 
import { match, RouterContext } from 'react-router'; 
import reducers from './reducers'; 
import routes from './routes'; 

export default (req, res) => { 
match({ routes, location: req.url }, (error, redirectLocation, renderProps) => { 
    if(error) { 
     res.status(500).send(error.message); 
    } else if(redirectLocation) { 
     res.redirect(302, redirectLocation.pathname + redirectLocation.search); 
    } else if(renderProps) { 
     res.status(200).send(` 
      <!DOCTYPE html> 
      <html> 
      <head> 
      <title>Req Management</title> 
      <link rel="stylesheet" href="https://unpkg.com/react-select/dist/react-select.css"> 
      </head> 
      <body> 
      <script src='/src/bundle.js'></script> 
      <div id='app'>${renderToString(
       <Provider store={createStore(reducers)}> 
       <RouterContext {...renderProps} /> 
       </Provider> 
      )}</div> 
      </body> 
      </html> 
      `); 
     } else { 
      console.log("inside else"); 
      res.status(404).send('Not found'); 
     } 
    }); 
}; 

Это мой package.json:

{ 
"name": "universal-boilerplate", 
"version": "1.4.0", 
"description": "Universal/isomorphic boilerplate with react, redux, webpack and express", 
"main": "src/index.js", 
"scripts": { 
"lint": "eslint ./src", 
"start": "npm run build && cross-env NODE_ENV=development babel-node ./server.js", 
"build": "webpack --config ./webpack.config.dev.js", 
"serve": "cross-env NODE_ENV=production babel-node ./server.js" 
}, 
"author": "", 
"license": "", 
"devDependencies": { 
"babel-cli": "^6.10.1", 
"babel-core": "^6.22.1", 
"babel-eslint": "^6.1.2", 
"babel-loader": "^6.2.10", 
"babel-plugin-transform-decorators-legacy": "^1.3.4", 
"babel-preset-es2015": "^6.22.0", 
"babel-preset-react": "^6.22.0", 
"babel-preset-react-hmre": "^1.1.1", 
"babel-preset-stage-0": "^6.5.0", 
"copy-webpack-plugin": "^3.0.1", 
"cross-env": "^2.0.0", 
"eslint": "^3.1.1", 
"eslint-plugin-babel": "^3.3.0", 
"eslint-plugin-react": "^5.2.2", 
"express": "^4.14.0", 
"react": "^15.2.1", 
"react-dom": "^15.2.1", 
"react-redux": "^4.4.5", 
"react-router": "^2.6.1", 
"react-router-redux": "^4.0.5", 
"redux": "^3.5.2", 
"rimraf": "^2.5.4", 
"webpack": "^1.13.1", 
"webpack-dev-middleware": "^1.6.1", 
"webpack-hot-middleware": "^2.12.2" 
}, 
"repository": { 
"type": "", 
"url": "" 
}, 
"dependencies": { 
"axios": "^0.13.1", 
"babel": "^6.5.2", 
"babel-cli": "^6.10.1", 
"babel-core": "^6.10.4", 
"babel-eslint": "^6.1.2", 
"babel-loader": "^6.2.4", 
"babel-plugin-transform-decorators-legacy": "^1.3.4", 
"babel-preset-es2015": "^6.22.0", 
"babel-preset-react": "^6.11.1", 
"babel-preset-react-hmre": "^1.1.1", 
"babel-preset-stage-0": "^6.5.0", 
"copy-webpack-plugin": "^3.0.1", 
"cross-env": "^2.0.0", 
"eslint": "^3.1.1", 
"eslint-plugin-babel": "^3.3.0", 
"eslint-plugin-react": "^5.2.2", 
"express": "^4.14.0", 
"fixed-data-table": "^0.6.3", 
"querystring": "^0.2.0", 
"react": "^15.2.1", 
"react-dom": "^15.2.1", 
"react-dropdown": "^1.2.0", 
"react-input-autosize": "^1.1.0", 
"react-redux": "^4.4.5", 
"react-router": "^2.6.1", 
"react-router-redux": "^4.0.5", 
"react-select": "^1.0.0-rc.3", 
"redux": "^3.5.2", 
"redux-logger": "^2.6.1", 
"redux-thunk": "^2.1.0", 
"rimraf": "^2.5.4", 
"style-loader": "^0.13.1", 
"webpack": "^1.14.0", 
"webpack-dev-middleware": "^1.6.1", 
"webpack-hot-middleware": "^2.12.2" 
} 
} 

Это мой index.js:

import React from 'react'; 
import { render } from 'react-dom'; 
import { Provider } from 'react-redux'; 
import { Router, browserHistory } from 'react-router'; 
import { syncHistoryWithStore } from 'react-router-redux'; 
import reducers from './reducers'; 
import routes from './routes'; 
import { applyMiddleware, createStore } from "redux" 
import logger from "redux-logger" 
import thunk from "redux-thunk" 

const middleware = applyMiddleware(thunk, logger()); 

const store = createStore(reducers, middleware); 
const history = syncHistoryWithStore(browserHistory, store); 

render(
<Provider store={store}> 
    <Router history={history} store={store}> 
     { routes } 
    </Router> 
</Provider>, 
document.getElementById('app') 
); 

if(process.env.NODE_ENV == 'development' && module.hot) { 
module.hot.accept('./reducers',() => { 
    store.replaceReducer(require('./reducers').default); 
}); 
} 

Я пытался развернуть этот код на Heroku. Сделали некоторые изменения в файле webpack.config.dev.js. Не удалось вернуться назад. До того, как код работал нормально локально. Теперь не работает также локально.

Folder structure is shown below:

+0

Можете ли вы предоставить скриншот структуры каталогов и продуктов питания, которые используются в вышеуказанном коде? –

+0

Я добавил изображение структуры папки. Не получилось, что вы имели в виду под едой. не могли бы вы уточнить ?? – Abhishek

+1

Я как-то попробовал попросить вас от ваших вопросов, а в качестве редактора ожидаю, что участники вопросов будут читать и понимать сообщения редактирования, отправленные в их виджет уведомлений. Поскольку этот вопрос содержит срочные просьбы, я ниспровергаю. Не добавляйте [вопросы, указывающие на срочность, нетерпение или право) (http://meta.stackoverflow.com/q/326569/472495), и помните, что большинство людей здесь ** добровольцы **. Спасибо! – halfer

ответ

1

Это, вероятно, вызвано это:

app.use(express.static(path.resolve(__dirname, 'src'))); 

Это делает src/ корень ваших статических ресурсов; другими словами, /SOME.FILE выглядит как src/SOME.FILE. Расширяя это до вашего URL-адреса, /src/bundle.js, он будет выглядеть как src/src/bundle.js, что, очевидно, неверно.

Есть несколько решений:

  • использования /bundle.js вместо /src/bundle.js в HTML
  • приставки пути для статического промежуточного слоя с /src:

    app.use('/src', express.static(path.resolve(__dirname, 'src'))); 
    

Я думаю, последнее было бы предпочтительнее.

+0

Это сработало ... Спасибо .. !!! – Abhishek

0

Относительно того, почему ваш код не работает локально. это может быть из-за того, что у вас есть опечатка. Вы проверки:

if(process.env.NODE_ENV === 'develospment') { 

Предположительно вы имели в виду 'развитие' ...

+0

Решено опечатка. Все еще получаю 404 для bundle.js. Пожалуйста помоги. – Abhishek

Смежные вопросы