亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

React全家桶環境搭建過程詳解

2024-05-06 16:44:30
字體:
來源:轉載
供稿:網友

本文介紹了React全家桶環境搭建過程詳解,分享給大家,具體如下:

環境搭建

1.從零開始搭建webpack+react開發環境

2.引入Typescript

安裝依賴

npm i -S @types/react @types/react-domnpm i -D typescript awesome-typescript-loader source-map-loader

新建tsconfig.json

{  "compilerOptions": {    "outDir": "./dist/",    "sourceMap": true,    "noImplicitAny": true,    "module": "commonjs",    "target": "es5",    "jsx": "react"  },  "include": [    "./src/**/*"  ]}

修改webpack.config.js

// webpack.config.jsconst path = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin');const webpack = require('webpack');module.exports = {  entry: {    index:'./src/index.js',  },  output: {    filename: 'bundle.js',    path: path.resolve(__dirname, 'dist')  },  devtool: "source-map",  // Add '.ts' and '.tsx' as resolvable extensions.  resolve: {    extensions: ['.ts', '.tsx', '.js', '.jsx']  },  module: {    rules: [      {        test: //.css$/,        use: ['style-loader', 'css-loader']      },      {        test: //.(png|svg|jpg|gif)$/,        use: ['url-loader']      },      {        test: //.(woff|woff2|eot|ttf|otf)$/,        use: ['url-loader']      },      {        test: //.(js|jsx)$/,        exclude: /node_modules/,        use: {          loader: 'babel-loader'        }      },      // All files with a '.ts' or '.tsx' extension will be handled by 'awesome-typescript-loader'.      {        test: //.tsx?$/,        loader: "awesome-typescript-loader"      },    ]  },  plugins: [    new HtmlWebpackPlugin({      title: 'production',      template: './index.html'    }),    new webpack.NamedModulesPlugin(),    new webpack.HotModuleReplacementPlugin()  ],  devServer: {    contentBase: './dist',    hot: true  },};

3.引入less并支持import less modules

安裝依賴

npm i -D less less-loadernpm i -D typings-for-css-modules-loader

tips:typings-for-css-modules-loader

打包時將樣式模塊化,我們可以通過import或require引入樣式,并且相互不沖突。

//demo.less -> demo.less.d.ts//.demo{color:red;} -> export const demo: string;import * as styles from 'demo.less'<DemoComponent className={styles.demo} /> 

修改webpack.config.js

// webpack.config.jsconst path = require('path');const HtmlWebpackPlugin = require('html-webpack-plugin');const webpack = require('webpack');module.exports = {  entry: {    index:'./src/index.js',  },  output: {    filename: 'bundle.js',    path: path.resolve(__dirname, 'dist')  },  devtool: "source-map",  //add .less  resolve: {    extensions: ['.ts', '.tsx', '.js', '.jsx', '.less', '.css']  },  module: {    rules: [      {        test: //.css$/,        use: ['style-loader', 'css-loader']      },      //import less modules,name:demo__demo___hash      {        test: //.less/,        use: [          'style-loader',          'typings-for-css-modules-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]&namedExport&camelCase&less!less-loader'        ]      },      {        test: //.(png|svg|jpg|gif)$/,        use: ['url-loader']      },      {        test: //.(woff|woff2|eot|ttf|otf)$/,        use: ['url-loader']      },      {        test: //.(js|jsx)$/,        exclude: /node_modules/,        use: {          loader: 'babel-loader'        }      },      {        test: //.tsx?$/,        loader: "awesome-typescript-loader"      },    ]  },  plugins: [    new HtmlWebpackPlugin({      title: 'production',      template: './index.html'    }),    new webpack.NamedModulesPlugin(),    new webpack.HotModuleReplacementPlugin()  ],  devServer: {    contentBase: './dist',    hot: true  },};

4.引入react-routerv4

npm i -S react-router-dom

創建history

import { createHashHistory } from 'history';export default createHashHistory();

使用

import React from 'react';import ReactDom from 'react-dom';import * as styles from "./index.less";import history from './helpers/history';import {Router, Route, Switch, Redirect, Link} from 'react-router-dom';import Hello from "./router/Hello";import TodoList from "./router/TodoList";const PrivateRoute = ({ component: Component , ...rest}) => {  return (    <Route {...rest} render={props => (      <Component {...props}/>    )}/>  );}ReactDom.render(  <Router history={history} >    <div className={styles.wrap}>      <ul>        <li><Link to="/">Homes</Link></li>        <li><Link to="/todo">TodoList</Link></li>      </ul>      <Switch>        <Route exact path="/" component={Hello}/>        {/*<Route path="/demo" component={Demo}/>*/}        <PrivateRoute path="/todo" component={TodoList} />      </Switch>    </div>  </Router>,  document.getElementById('root'));

...ES7語法報錯

npm i -S babel-preset-stage-2

修改.babelrc

{ "presets": ["es2015", "react", "stage-2"],}

5.引入mobx狀態管理

npm i -S mobx mobx-react

使用裝飾器語法

修改tsconfig.json

"compilerOptions": {  "target":"es2017", //fix mobx.d.ts error  "experimentalDecorators": true,  "allowJs": true}
npm i -D babel-plugin-transform-decorators-legacy

修改.babelrc

{ "presets": ["es2015", "react", "stage-2"], "plugins": ["transform-decorators-legacy"]}

源碼

Github

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
午夜精品视频在线| 亚洲香蕉成视频在线观看| 精品久久久久久亚洲国产300| 亚洲精品永久免费精品| 久久精品国产清自在天天线| 成人做爽爽免费视频| 日韩一区二区福利| 国产一区二区黄| 久久久久久国产精品三级玉女聊斋| 久久久久久18| 国产精品美乳在线观看| 国产免费亚洲高清| 国产精品视频资源| 韩国日本不卡在线| 亚洲最新av在线| 久久久精品视频在线观看| 欧洲中文字幕国产精品| 亚洲欧美日韩精品久久奇米色影视| 国产精品91免费在线| 亚洲人成电影网站色| 成人伊人精品色xxxx视频| 国产香蕉精品视频一区二区三区| 欧美日韩国产一区二区三区| 日韩激情av在线免费观看| 亚洲风情亚aⅴ在线发布| 亚洲精品网址在线观看| 69视频在线免费观看| 亚洲天堂av在线免费| 精品少妇v888av| 在线成人激情视频| 538国产精品一区二区免费视频| 色伦专区97中文字幕| 2021国产精品视频| 久久91亚洲精品中文字幕| 日韩日本欧美亚洲| 久久久久久久国产精品| 久久久亚洲影院| 91精品美女在线| 国外成人在线视频| 不卡av电影在线观看| 欧美成人小视频| 亚洲一二三在线| 国产精品一区专区欧美日韩| 亚洲第一区在线| 精品亚洲国产视频| 成人xvideos免费视频| 成人久久一区二区三区| 国产精品极品美女在线观看免费| 日韩欧美在线中文字幕| 羞羞色国产精品| 亚洲国产中文字幕在线观看| 日韩毛片中文字幕| 国产精品wwww| 久久久精品一区二区| 久热精品在线视频| 亚洲国产婷婷香蕉久久久久久| 国产精品成人免费电影| 国产精品视频99| 亚洲天堂久久av| 国产精品aaaa| 狠狠躁18三区二区一区| 国语自产在线不卡| 国产欧美日韩免费看aⅴ视频| 欧美日韩亚洲精品一区二区三区| 国产亚洲精品美女| 欧美夫妻性生活xx| 这里只有精品视频在线| 日韩av影片在线观看| 成人深夜直播免费观看| 精品亚洲永久免费精品| 亚洲成人激情在线观看| 色综合久久天天综线观看| 欧美刺激性大交免费视频| 亚洲香蕉伊综合在人在线视看| 欧美乱人伦中文字幕在线| 国产精品pans私拍| 国产一区二区丝袜高跟鞋图片| 国产成人aa精品一区在线播放| 欧美高清第一页| 国产精品亚洲自拍| 中文.日本.精品| 在线精品国产成人综合| 亚洲精品视频在线播放| 久久久精品国产网站| 国产一区二区三区视频免费| 欧美大尺度电影在线观看| 一区二区亚洲精品国产| 91高清视频免费观看| 日韩最新在线视频| www国产亚洲精品久久网站| 国产丝袜精品第一页| 国自在线精品视频| 欧美激情视频免费观看| 精品视频一区在线视频| 精品视频—区二区三区免费| www.99久久热国产日韩欧美.com| 欧美孕妇与黑人孕交| 日韩在线观看高清| 日韩hd视频在线观看| 亚洲欧美精品suv| 中文在线资源观看视频网站免费不卡| 久久精品成人欧美大片| 久久91亚洲精品中文字幕| 日韩人在线观看| 亚洲深夜福利网站| 亚洲偷熟乱区亚洲香蕉av| 欧美限制级电影在线观看| 日韩免费中文字幕| 成人黄色片在线| 日韩成人av网址| 国产精品一区二区久久精品| 久久久91精品国产一区不卡| 成人做爰www免费看视频网站| 久久久久国产一区二区三区| 亚洲国产成人在线视频| 国产精品一久久香蕉国产线看观看| 国产精品一久久香蕉国产线看观看| 麻豆一区二区在线观看| 午夜精品一区二区三区在线| 国产精品欧美激情| 国产中文字幕亚洲| 国产精品99免视看9| 国产aⅴ夜夜欢一区二区三区| 国产精品看片资源| 狠狠综合久久av一区二区小说| 午夜精品在线观看| 亚洲精品v欧美精品v日韩精品| 亚洲电影成人av99爱色| 亚洲性av在线| 国产视频福利一区| 欧美综合第一页| 国产一区玩具在线观看| 国产精品一区二区性色av| 国产成人综合亚洲| 日本精品久久电影| 日韩中文字幕视频在线观看| 中文字幕亚洲精品| 久久夜色精品国产| 久久综合88中文色鬼| 亚洲视频在线观看| 亚洲精品www| 日韩暖暖在线视频| 日韩福利视频在线观看| 久久av.com| 国产欧美韩国高清| 精品美女永久免费视频| 91国产在线精品| 久久久噜噜噜久噜久久| 欧美在线视频在线播放完整版免费观看| 国产日韩欧美在线播放| 日韩欧美高清在线视频| 国产精品高潮呻吟久久av无限| 国产精品国语对白| 国产精品久久久久免费a∨大胸| 欧美一级淫片丝袜脚交| 91免费精品国偷自产在线| 日韩午夜在线视频| 亚洲自拍偷拍在线| 韩国精品美女www爽爽爽视频| 成人在线视频福利| 91成人国产在线观看| 91久久嫩草影院一区二区| 精品无码久久久久久国产| 亚洲第一视频在线观看|