webpack4를 기반으로 반응 프로젝트 프레임워크를 구축하는 방법

不言
풀어 주다: 2018-06-30 15:24:30
원래의
1696명이 탐색했습니다.

이 글은 webpack4를 기반으로 React 프로젝트 프레임워크를 구축하는 방법을 주로 소개하고 있는데 내용이 꽤 좋아서 참고용으로 올려보겠습니다.

소개

antd를 통합하고 webpac을 사용하여 구축된 반응형 단일 페이지 애플리케이션인 프레임워크를 소개합니다. webpack-dev-server를 사용하여 로컬 서비스를 시작하고 핫 업데이트를 추가하여 개발 및 디버깅을 촉진하세요. 코드 커팅 및 레이지 로딩을 위해 번들 로더를 사용하세요

cli를 사용하지 않고 수동으로 빌드되었으며 많은 댓글이 초보자가 웹팩을 이해하고 배우기에 적합하며 반응 프로젝트에 대한 심층적인 이해를 갖습니다

Startup

 git clone https://gitee.com/wjj0720/react-demo.git
 cd react-demo
 yarn
 yarn start
로그인 후 복사

Packaging

yarn build
로그인 후 복사

디렉터리 구조

 +node_modules
 -src
  +asset
  +Layout
  +pages
  +redux
  +utils
  +app.js
  +index.html
  +index.js
 .babelrc 
 package.json 
 postcss.config.js
 webpack.config.js //webpack 配置
로그인 후 복사

번들 로더는 지연 로딩을 사용합니다

 // webpack.config.js 配置
 module: {
  rules: [
   {
    test: /\.bundle\.js$/,
    use: {
     loader: 'bundle-loader',
     options: {
      name: '[name]',
      lazy: true
     }
    }
   }
  ]
 }
 // 页面引入组件
 import Home from "bundle-loader?lazy&name=[name]!./Home";

 // 组件使用 因为组件懒加载 是通过异步的形式引入 所以不能再页面直接以标签的形式使用 需要做使用封装 
 import React, {Component} from 'react'
 import { withRouter } from 'react-router-dom'
 class LazyLoad extends Component {
  state = {
   LoadOver: null
  }
  componentWillMount() {
   this.props.Loading(c => {
    this.setState({
     LoadOver: withRouter(c.default)
    })
   })
  }
 
  render() {
   let {LoadOver} = this.state;
   return (
    LoadOver ? <LoadOver/> : <p>加载动画</p>
   )
  }
 }
 export default LazyLoad

 // 通过封装的懒加载组件过度 增加加载动画
 <LazyLoad Loading={Home} />
로그인 후 복사

라우팅 구성

프레임워크는 모듈별로 나누어져 있습니다. 페이지 폴더 아래의 Route.js는

 // 通过require.context读取模块下路由文件
 const files = require.context(&#39;./pages&#39;, true, /route\.js$/)
 let routers = files.keys().reduce((routers, route) => {
  let router = files(route).default
  return routers.concat(router)
 }, [])

 // 模块路由文件格式
 import User from "bundle-loader?lazy&name=[name]!./User";
 export default [
  {
   path: &#39;/user&#39;,
   component: User
  },
  {
   path: &#39;/user/:id&#39;,
   component: User
  }
 ]
로그인 후 복사

redux 사용 소개

 // ---------创建 --------
 // 为了不免action、reducer 在不同文件 来回切换 对象的形式创建

 // createReducer 将书写格式创建成rudex认识的reducer
 export function createReducer({state: initState, reducer}) {
  return (state = initState, action) => {
   return reducer.hasOwnProperty(action.type) ? reducer[action.type](state, action) : state
  }
 }

 // 创建页面级别的store
 const User_Info_fetch_Memo = &#39;User_Info_fetch_Memo&#39;
 const store = {
  // 初始化数据
  state: {
   memo: 9,
   test: 0
  },
  action: {
   async fetchMemo (params) {
    return {
     type: User_Info_fetch_Memo,
     callAPI: {url: &#39;http://stage-mapi.yimifudao.com/statistics/cc/kpi&#39;, params, config: {}},
     payload: params
    }
   },
   ...
  },
  reducer: {
   [User_Info_fetch_Memo] (prevState = {}, {payload}) {
    console.log(&#39;reducer--->&#39;,payload)
    return {
     ...prevState,
     memo: payload.memo
    }
   },
   ...
  }
 }

 export default createReducer(store)
 export const action = store.action

 // 最终在模块界别组合 [当然模块也有公共的数据(见Home模块下的demo写法)]
 import {combineReducers} from &#39;redux&#39;
 import info from &#39;./Info/store&#39;
 export default combineReducers({
  info,
  。。。
 })

 // 最终rudex文件夹下的store.js 会去取所有模块下的store.js 组成一个大的store也就是我们最终仓库

 // --------使用------
 // 首先在app.js中将store和app关联
 import { createStore } from &#39;redux&#39;
 import { Provider } from &#39;react-redux&#39;
 // reducer即我们最终
 import reducer from &#39;./redux/store.js&#39;
 // 用户异步action的中间件
 import middleware from &#39;./utils/middleware.js&#39;
 let store = createStore(reducer, middleware)
 <Provider store={store}>
  。。。
 </Provider>


 // 然后组件调用 只需要在组件导出时候 使用connent链接即可
 import React, {Component} from &#39;react&#39;
 import {connect} from &#39;react-redux&#39;
 // 从页面级别的store中导出action
 import {action} from &#39;./store&#39;

 class Demo extends Component {
  const handle = () => {
   // 触发action
   this.props.dispatch(action.fetchMemo({}))
  }
  render () {
   console.log(this.props.test)
   return <p onClick={this.handle}>ss</p>
  }
 }
 export default connect(state => ({
  test: state.user.memo.test
 }) )(demo)
로그인 후 복사

redux 미들웨어에 대하여

 // 与其说redux中间件不如说action中间件
 // 中间件执行时机 即每个action触发之前执行

 // 
 import { applyMiddleware } from &#39;redux&#39;
 import fetchProxy from &#39;./fetchProxy&#39;;

 // 中间件 是三个嵌套的函数 第一个入参为整个store 第二个为store.dispatch 第三个为本次触发的action 
 // 简单封装的中间件 没有对请求失败做过多处理 目的在与项错误处理机制给到页面处理
 const middleware = ({getState}) => next => async action => {
  // 此时的aciton还没有被执行 
  const {type, callAPI, payload} = await action
  // 没有异步请求直接返回action
  if (!callAPI) return next({type, payload})
  // 请求数据
  const res = await fetchProxy(callAPI)
  // 请求数据失败 提示
  if (res.status !== 200) return console.log(&#39;网络错误!&#39;)
  // 请求成功 返回data
  return next({type, payload: res.data})
 }
 export default applyMiddleware(middleware)
로그인 후 복사

위 내용은 이 글의 요약입니다. 모든 내용이 공부에 도움이 되었으면 좋겠습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요!

관련 권장 사항:

React에서 구성 요소를 만드는 세 가지 방법과 차이점에 대해

파일 검색 범위를 좁히기 위한 Webpack 최적화 구성 소개

위 내용은 webpack4를 기반으로 반응 프로젝트 프레임워크를 구축하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿