您好,欢迎来到二三娱乐。
搜索
您的当前位置:首页React多页面应用

React多页面应用

来源:二三娱乐

之前使用react开发了一个单页面的后台管理项目。因为项目越来越大,并且奇怪的需求越来越多,单页面给许多功能的开发带来了不好的体验,因此趁着这个机会研究了一下多页面开发方式。
在网上查了好多资料,但大部分都讲得有点模糊,不够详细,对于我这种菜鸟来说开发体验极差-_-||,明明很简单的东西……
所以,特此记录,以便于自己日后回顾学习。

言归正传

本文只需要使用者对react框架有基础的认识,并且能够动手跟着一起操作(看再多也不如敲两行代码),我也是一遍操作一遍写,确保能够正常运行。对于常用的运行环境,不另做讲解,可以搜索相关词条,自己动手查资料。

1、创建react项目
使用FB提供的脚手架----create-react-app进行项目创建:
create-react-app multipage


image.png

2、显示webpack相关文件:
npm run eject
当询问是否确认弹出?该操作不可逆的时候,输入Y,或者Y开头的任何词语,╮(╯_╰)╭
项目会对出这两个目录


image.png

我们主要用到的是webpack.config.dev.js(开发环境)和webpack.config.prod.js(生产环境)。因为我只是在本地开发测试的,所以不确定product下是否会有差别。其实应该是没有的,但坑踩多了,人就怂了- -。

3、整理src目录
为了保证目录清晰,删除一切多余的文件(图标、样式),仅保留必须的js文件,并按照真正的项目创建目录:


image.png

4、修改webpack.config.dev.js配置
我们主要修改以下几处


image.png
module.exports = {
//修改入口配置。
entry: {
  home:[
    //引入三个es6新特性
    require.resolve('./polyfills'), 
    //热更新
    require.resolve('react-dev-utils/webpackHotDevClient'),
    //入口文件,仅需修改此行代码
    path.resolve(paths.appSrc, "index.js")
    // paths.appIndexJs
  ],
  pageF:[
    //引入三个es6新特性
    require.resolve('./polyfills'),
    //热更新
    require.resolve('react-dev-utils/webpackHotDevClient'),
    //入口文件,仅需修改此行代码
    path.resolve(paths.appSrc, "pageF/index.js")
  ],
  page0:[
    //引入三个es6新特性
    require.resolve('./polyfills'),
    //热更新
    require.resolve('react-dev-utils/webpackHotDevClient'),
    //入口文件,仅需修改此行代码
    path.resolve(paths.appSrc, "pageF/page0/index.js")
  ],
  page1:[
    //引入三个es6新特性
    require.resolve('./polyfills'),
    //热更新
    require.resolve('react-dev-utils/webpackHotDevClient'),
    //入口文件,仅需修改此行代码
    path.resolve(paths.appSrc, "pageF/page1/index.js")
  ],
  pageS:[
    //引入三个es6新特性
    require.resolve('./polyfills'),
    //热更新
    require.resolve('react-dev-utils/webpackHotDevClient'),
    //入口文件,仅需修改此行代码
    path.resolve(paths.appSrc, "pageS/index.js")
  ]
},
output: {
  // Add /* filename */ comments to generated require()s in the output.
  pathinfo: true,
  // This does not produce a real file. It's just the virtual path that is
  // served by WebpackDevServer in development. This is the JS bundle
  // containing code from all our entry points, and the Webpack runtime.
  //修改此处,防止JS名称重复
  filename: 'static/js/[name].[hash:8].js',
  chunkFilename: 'static/js/[name].[hash:8].chunk.js',
  // This is the URL that app is served from. We use "/" in development.
  publicPath: publicPath,
  // Point sourcemap entries to original disk location (format as URL on Windows)
  devtoolModuleFilenameTemplate: info =>
    path.resolve(info.absoluteResourcePath).replace(/\\/g, '/'),
},

plugins:[
  new InterpolateHtmlPlugin(env.raw),
  new HtmlWebpackPlugin({
    inject: true,
    template: paths.appHtml,
  }),
  //添加以下内容
  new HtmlWebpackPlugin({
    inject: true,
    chunks: ['home'],
    template: paths.appHtml,
    filename: "index.html"
  }),
  new HtmlWebpackPlugin({
    inject: true,
    chunks: ['pageF'],
    template: paths.appHtml,
    filename: "pageF/index.html"
  }),
  new HtmlWebpackPlugin({
    inject: true,
    chunks: ['page0'],
    template: paths.appHtml,
    filename: "pageF/page0/index.html"
  }),
  new HtmlWebpackPlugin({
    inject: true,
    chunks: ['page1'],
    template: paths.appHtml,
    filename: "pageF/page1/index.html"
  }),
  new HtmlWebpackPlugin({
    inject: true,
    chunks: ['pageS'],
    template: paths.appHtml,
    filename: "pageS/index.html"
  }),
  //结束
  new webpack.NamedModulesPlugin(),
  new webpack.DefinePlugin(env.stringified),
  new webpack.HotModuleReplacementPlugin(),
  new CaseSensitivePathsPlugin(),
  new WatchMissingNodeModulesPlugin(paths.appNodeModules),
  new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
]

}

5、修改js
因为附带的有git地址,因此只粘贴home页面的JS

import React, { Component } from 'react';
import ReactDOM from 'react-dom';

class App extends Component {
  render() {
    return (
      <div className="App">
        <header className="App-header">
          <h1 className="App-title">Welcome to React</h1>
        </header>
        <p className="App-intro">
          To get started, edit <code>src/App.js</code> and save to reload.
        </p>
        <a href="pageF/index.html">pageF</a>
        <div>
          <a href="pageS/index.html">pageS</a>
        </div>
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById('root'));

Copyright © 2019- yule263.com 版权所有 湘ICP备2023023988号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务