React全家桶环境搭建过程详解


Posted in Javascript onMay 18, 2018

本文介绍了React全家桶环境搭建过程详解,分享给大家,具体如下:

环境搭建

1.从零开始搭建webpack+react开发环境

2.引入Typescript

安装依赖

npm i -S @types/react @types/react-dom
npm 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.js
const 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-loader
npm 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.js
const 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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript基本对象
Jan 11 Javascript
使用Js让Html中特殊字符不被转义
Nov 05 Javascript
事件委托与阻止冒泡阻止其父元素事件触发
Sep 02 Javascript
盘点javascript 正则表达式中 中括号的【坑】
Mar 16 Javascript
前端微信支付js代码
Jul 25 Javascript
Node.js connect ECONNREFUSED错误解决办法
Sep 15 Javascript
JavaScript原生实现观察者模式的示例
Dec 15 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
Sep 17 Javascript
webpack4 optimization使用总结
Nov 10 Javascript
vue接口请求加密实例
Aug 11 Javascript
js实现删除json中指定的元素
Sep 22 Javascript
vue如何使用模拟的json数据查看效果
Mar 31 Vue.js
vue单页开发父子组件传值思路详解
May 18 #Javascript
Node.js Buffer用法解读
May 18 #Javascript
从零开始搭建webpack+react开发环境的详细步骤
May 18 #Javascript
Bootstrap table中toolbar新增条件查询及refresh参数使用方法
May 18 #Javascript
webpack4 css打包压缩问题的解决
May 18 #Javascript
微信小程序实现长按删除图片的示例
May 18 #Javascript
解决Vue中mounted钩子函数获取节点高度出错问题
May 18 #Javascript
You might like
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
2008/10/13 PHP
openPNE常用方法分享
2011/11/29 PHP
PHP使用array_multisort对多个数组或多维数组进行排序
2014/12/16 PHP
PHP+MySQL插入操作实例
2015/01/21 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
2018/05/12 PHP
jquery调用asp.net 页面后台的实现代码
2011/04/27 Javascript
jqPlot 图表中文API使用文档及源码和在线示例
2012/02/07 Javascript
重写document.write实现无阻塞加载js广告(补充)
2014/12/12 Javascript
angular2使用简单介绍
2016/03/01 Javascript
AngularJS实现标签页的两种方式
2016/09/05 Javascript
jquery购物车结算功能实现方法
2020/10/29 Javascript
tablesorter.js表格排序使用方法(支持中文排序)
2017/02/10 Javascript
原生js实现轮播图
2017/02/27 Javascript
vue 项目中使用Loading组件的示例代码
2018/08/31 Javascript
angular 数据绑定之[]和{{}}的区别
2018/09/25 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
微信小程序实现蒙版弹出窗功能
2019/09/17 Javascript
webpack 动态批量加载文件的实现方法
2020/03/19 Javascript
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
python调用百度语音识别实现大音频文件语音识别功能
2018/08/30 Python
Python初学者需要注意的事项小结(python2与python3)
2018/09/26 Python
解决Django中调用keras的模型出现的问题
2019/08/07 Python
详解Python的三种拷贝方式
2020/02/11 Python
Python如何实现Paramiko的二次封装
2021/01/30 Python
HTML5 解析规则分析
2009/08/14 HTML / CSS
HTML5之消息通知的使用(Web Notification)
2018/10/30 HTML / CSS
德国EGOIST网店:销售畅销的设计师品牌
2017/04/18 全球购物
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
意大利和国际最佳时尚品牌:Drestige
2019/12/28 全球购物
会计专业自荐信范文
2013/12/02 职场文书
学习十八大标语
2014/10/09 职场文书
2014年销售部工作总结
2014/12/01 职场文书
鲁冰花观后感
2015/06/10 职场文书
领导莅临指导欢迎词
2015/09/30 职场文书
倡议书怎么写?
2019/04/11 职场文书
Python中的datetime包与time包包和模块详情
2022/02/28 Python