我使用react js创建了一个单页Web应用程序。我使用webpack
来创建所有组件的捆绑。但现在我想创建许多其他页面。大多数页面都与API调用相关。即在index.html
中,我显示了来自API
的内容。我想在另一个页面中插入内容来解析API中的数据。 Webpack压缩文件中的所有响应bundle.js
。但是,webpack
的配置如下:
const webpack = require('webpack');
var config = {
entry: './main.js',
output: {
path:'./',
filename: 'dist/bundle.js',
},
devServer: {
inline: true,
port: 3000
},
module: {
loaders: [
{
test: /\.jsx?$/,
exclude: /node_modules/,
loader: 'babel',
query: {
presets: ['es2015', 'react']
}
}
]
},
plugins: [
new webpack.DefinePlugin({
'process.env': {
'NODE_ENV': JSON.stringify('production')
}
}),
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
}
})
]
}
module.exports = config;
现在,我很困惑webpack
对其他网页的配置类型或使用react.js
构建多页面应用的正确方法
答案 0 :(得分:43)
(确保使用npm安装react-router!)
要使用react-router,请执行以下操作:
使用Route,IndexRoute组件创建路径的文件
将路由器(带'r'!)组件作为应用程序的顶级组件注入,传递路由文件中定义的路由和历史记录类型(hashHistory, browserHistory)
第1步 routes.js
import React from 'react';
import { Route, IndexRoute } from 'react-router';
/**
* Import all page components here
*/
import App from './components/App';
import MainPage from './components/MainPage';
import SomePage from './components/SomePage';
import SomeOtherPage from './components/SomeOtherPage';
/**
* All routes go here.
* Don't forget to import the components above after adding new route.
*/
export default (
<Route path="/" component={App}>
<IndexRoute component={MainPage} />
<Route path="/some/where" component={SomePage} />
<Route path="/some/otherpage" component={SomeOtherPage} />
</Route>
);
第2步 入口点(进行DOM注入的地方)
// You can choose your kind of history here (e.g. browserHistory)
import { Router, hashHistory as history } from 'react-router';
// Your routes.js file
import routes from './routes';
ReactDOM.render(
<Router routes={routes} history={history} />,
document.getElementById('your-app')
);
第3步 应用程序组件(props.children)
在App组件的渲染中,添加{this.props.children}:
render() {
return (
<div>
<header>
This is my website!
</header>
<main>
{this.props.children}
</main>
<footer>
Your copyright message
</footer>
</div>
);
}
第4步 使用链接进行导航
组件渲染函数返回JSX值的任何地方,使用链接组件:
import { Link } from 'react-router';
(...)
<Link to="/some/where">Click me</Link>
答案 1 :(得分:8)
这是一个广泛的问题,您可以通过多种方式实现这一目标。根据我的经验,我看到很多单页应用程序都有一个入口点文件,例如index.js
。该文件将负责“引导”应用程序,并将成为webpack的入口点。
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import Application from './components/Application';
const root = document.getElementById('someElementIdHere');
ReactDOM.render(
<Application />,
root,
);
您的<Application />
组件将包含您应用的下一部分。你已经表明你想要不同的页面,这让我相信你正在使用某种路由。这可以包含在此组件中以及需要在应用程序启动时调用的任何库。我会想到react-router
,redux
,redux-saga
,react-devtools
。这样,您只需要在webpack配置中添加一个入口点,从某种意义上说,一切都会崩溃。
当您设置路由器时,您可以选择将组件设置为特定的匹配路由。如果您的网址为/about
,则应在您正在使用的任何路由包中创建路由,并使用您需要的任何信息创建About.js
的组件。
答案 2 :(得分:3)
对于网络应用程序,我建议您阅读以下两个示例:
1-添加react-router-dom
:
纱线
yarn add react-router-dom
或 NPM
npm install react-router-dom
2-使用以下方法更新您的index.js
文件:
import { BrowserRouter } from 'react-router-dom';
ReactDOM.render((
<BrowserRouter>
<App />
</BrowserRouter>
), document.getElementById('root')
);
3-创建一个Main组件并在其中调用页面(您还应该已经创建了页面组件):
import React from 'react';
import { Switch, Route } from 'react-router-dom';
import Home from '../pages/Home';
import Signup from '../pages/Signup';
const Main = () => {
return (
<Switch>
<Route exact path='/' component={Home}></Route>
<Route exact path='/signup' component={Signup}></Route>
</Switch>
);
}
export default Main;
4-在App.js
文件中添加主要组件:
function App() {
return (
<div className="App">
<Navbar />
<Main />
</div>
);
}
5-将链接添加到您网页的某处
<Link to="/signup">
<button variant="outlined">
Sign up
</button>
</Link>
答案 3 :(得分:0)
问题的第二部分得到了很好的回答。这是第一部分的答案:如何使用webpack输出多个文件:
entry: {
outputone: './source/fileone.jsx',
outputtwo: './source/filetwo.jsx'
},
output: {
path: path.resolve(__dirname, './wwwroot/js/dist'),
filename: '[name].js'
},
这将生成2个文件:目标文件夹中的outputone.js和outputtwo.js。