搭建react項目

從零開始搭建React項目

  1. npm init
  2. 先安裝
  • --save-dev開發環境(devDependencies), --save是線上運行所須要的包(dependencies);
  • npm i webpack webpack-cli html-webpack-plugin webpack-dev-server --save-dev
  • npm i react react-dom babel-core babel-loader@7 babel-preset-es2015 babel-preset-react --save
  1. 在項目的跟目錄下面創建webpack.config.js
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require("html-webpack-plugin");

module.exports = {
  // 指定入口文件,程序從這裏開始,__dirname當前所在目錄
  entry: path.resolve(__dirname, './src/index.js'),
  output: {
    // 輸出路徑
    path: path.resolve(__dirname,'./dist'),
    // 打包後文件
    filename: 'app/[name]_[hash:8].js'
  },
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        loader: 'babel-loader',
        exclude: /node_modules/
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, "index.html")
    }),
    new webpack.HotModuleReplacementPlugin(),
  ],
  devServer: {
    contentBase: path.resolve(__dirname,  '/dist'),//本地服務器所加載的頁面所在的目錄
    port: 1313,
    inline: true,
    hot: true,
    historyApiFallback: true
  },
}
複製代碼

4 .在項目的根目錄創建文件.babelrcjavascript

{
  "presets": [
    "es2015",
    "react"
  ]
}
複製代碼

5 . 在項目跟目錄創建index.htmlcss

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="root"></div>
</body>
</html>
複製代碼

6 . 在項目根目錄創建src文件夾,src->index.jshtml

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

ReactDOM.render(
  <div>hello,react</div>,
  document.getElementById('root')
)
複製代碼

pageckage.json中的scripts添加
"dev": "webpack-dev-server --open --mode development" 安裝npm install --save-dev babel-cli babel-preset-env,支持es7@裝飾器的用法,java

在.babelrc導入{ "presets": ["env"] }node

7 . 按需加載路由react

npm i react-router --savewebpack

在webpack.config.js文件中添加web

在src文件下創建routes路由文件夾,其中主入口文件爲index.js,其餘的路由文件也放在這裏。

  • 其中用到了es7@裝飾器的用法:
  • 先裝插件:npm i babel-plugin-transform-decoratorors-legacy babel-preset-stage-2 babel-preset-react-native-stage-0 --save-dev
  • 而後在.babelrc文件里加上

  • 在routes裏的主文件index.js裏
export default {
  path: '/',
  indexRoute: {
    getComponent(nextState, cb) {
      require.ensure([], (require) => {
        console.log('進來了')
        cb(null, require('../pages/homepage').default);
      }, 'home');
    },
  },
  component: require('../App').default,
  childRoutes: [
    require('./HomePage/index').default,
    require('./BaiDu/index').default,
    require('./LianXin/index').default,
  ]
}
複製代碼
  • 其中,indexRoute爲初始化時候,加載的頁面,component引進來的App文件;childRoutes爲須要用到時候加載的; routes文件下的相似homePage文件,裏面寫的則利用getComponent,require.ensure()引用到的時候加載。**
  • (注意:這種寫法不適合react-router4及以上);**
export default {
  path: 'home',
  getComponent(nextProps, cb) {
    require.ensure(
      [],
      require => {
        cb(null,require('../../pages/homepage').default)
      },
      'home'
    )
  }
}
複製代碼

7.2 在src文件夾下創建App.js文件npm

import LeftContainer from './components/leftContainer';

// @LeftContainer中的WrappedComponent就是當前的這個App.js
// App = LeftContainer(App) || App;

@LeftContainer
 class App extends React.Component {
  render(){
    const { children }= this.props;
    console.log('children是',children)
    return(
      <div> {children} </div>
    )
  }
}
export default App;
複製代碼

其中的components文件下創建leftContainer.js;json

import React, { Component } from 'react';
import { Link } from 'react-router';
import Home from '../pages/homepage';
import BaiDu from '../pages/baidu';
import Lianxin from '../pages/lianxin';


const Container = Inner => {
  return class LeftContainer extends Component {
    render(){
      const props = {...this.props}
      return(
        <div>
            <Link to={'/home'}>home頁</Link>
            <Link to={'/baidu'}>badu頁</Link>
            <Link to={'/lianxin'}>lianxin頁</Link>
            <Inner {...props} />
        </div>
      )
    }
  }
}
export default Container;
複製代碼

8 .安裝less, 瀏覽器前綴

  • npm i less less-loader css-loader postcss-loader style-loader autoprefixer --save-dev
  • 在webpack.config.js裏的rules中添加上這一句
{
        test: /\.(css|less)$/,
        use: ["style-loader", "css-loader",
        // 添加瀏覽器自動加前綴配置
        {loader: 'postcss-loader',options:{plugins:[require("autoprefixer")("last 100 versions")]}},
        "less-loader"
        ]
      },
複製代碼

9 . 引用antd樣式庫

  • npm i antd babel-plugin-import --save
  • .babelrc文件添加:
"plugins": [
    ["import", { "libraryName": "antd", "libraryDirectory": "es", "style": "css" }],
  ]
複製代碼
  • 在index.js文件引入
import { LocaleProvider } from 'antd';
import zh_CN from 'antd/lib/locale-provider/zh_CN';
import 'moment/locale/zh-cn';
複製代碼

相關文章
相關標籤/搜索