React实战(一):从零配置开始搭建React项目

20170222224205_TJiHu.jpeg

前言

这几天断断续续地学习React.js,然后想尝试用react做一些实战的小项目,深入了解react的本质。网上有很多类似这个教程的,但有些比较旧的,有些讲的不太具体,然后我就一边参考并且修改,一边coding,记录下~

技术栈:webpack4 + react + react-router-dom

作为一枚前端er,应该知道webpack4有个最大的特点,就是能实现零配置的自由。本来想用 \color{#FF0000}{create-react-app} 快速搭建一个项目的,但又想我正好要学习webpack4,不妨就一起学下,了解零配置是怎么实现的,是怎么配置的。

----------- It's show time -----------

1、初始化项目,安装插件

  • 先建立一个文件夹,然后初始化package.json
mkdir react-demo && cd react-demo //建立react-demo并进入react-demo
npm init -y //快速初始化package.json

然后就会发现react-dome生成一个package.json,我们安装的插件,信息都在这个文件里面。

  • 安装相关webpack的插件
    开始安装react的插件,首先要安装webpack的插件,我用yarn来管理插件,也可以用npm。
    需要安装的插件:
    1、webpack
    2、webpack-cli:webpack的命令工具,既然安装webpack,就必要安装这个
    3、webpack-dev-server:启动http服务
    4、webpack-merge: 引用通用的配置来组合,比如开发环境的配置和生产环境的配置共用一个common.js
yarn add webpack webpack-cli webpack-dev-server webpack-merge --dev 
  • 安装相关react的插件
    目前就安装react,react-dom
yarn add react react-dom
  • 安装相关babel的插件
    既然用react,那就需要用到babel的插件
    需要的插件
    1、babel-loader:文件处理器,加载js文件
    2、@babel/core:最新的版本,之前是babel-core,是babel的核心功能
    3、@babel/preset-env:也是最新的版本,之前是babel-preset-env。因为webpack不能识别es6以上,所以需要这个插件来转换es5
    4、@babel/preset-react:也是最新的版本,之前是babel-preset-react,用来转换react的语法
yarn add babel-loader @babel/core @babel/preset-env @babel/preset-react --dev
  • 安装html-webpack-plugin的插件
    自动生成html文件,尤其能随着编译的变化而变化,不需要手动改变bundle.js
//安装插件
yarn add html-webpack-plugin --dev

2、配置webpack

配置webpack之前,首先要考虑怎么配置webpack,为了后面方便维护或者方便管理的,我们通常会把开发环境和生产环境分开管理,各自修改或者维护。然后我就参考这个思维,就在项目根目录下新建一个config的文件夹,然后建立三个文件,一个是通用的配置(webpack.common.js),一个是开发环境的配置(webpack.dev.js),一个是生产环境的配置(webpack.prod.js),如图下:


webpack配置的文件夹.png
  • 通用的配置
    开发和生产环境的通用配置放到这个,比如说设置入口,出口打包
//webpack.common.js
const path=require('path'); //路径的api
const HtmlWebpackPlugin=require('html-webpack-plugin');//引用html-webpack-plugin

module.exports={
//入口的设置
    entry:{
        app:'./src/index.js', //入口的文件名
    },

//http服务的设置
    devServer:{ //利用上面的webpack-dev-server插件
        port:1234 //端口号,默认是8080,8080这个端口号很容易被占用,前端应该不常出现。反正我喜欢设置1234
    },

//管理资源
module:{
        rules:[
            {
                //加载js
                test: /\.js$/,
                use: 'babel-loader',
                exclude: /node_modules/,
            }
        ]
 },

//出口的设置
    output:{
        filename:'[name].bundle.js',//命名文件
        path:path.resolve(__dirname,'../dist')//生成的位置
    }
}
  • 开发环境的配置
//webpack.dev.js
const common=require('./webpack.common.js');//引用通用配置
const merge=require('webpack-merge');//引用webpack-merge插件

module.exports=merge(common,{
    mode:'development', //开发的模式
})

目前的配置就简单点,后面需要的时候就再扩展

  • 生产环境的配置
//webpack.prod.js
const merge=require('webpack-merge');
const common=require('./webpack.common.js');

module.exports=merge(common,{
    mode:'production'
})
  • 既然用react和es6,那就需要配置.babelrc,就在项目的根目录下新建
//.babelrc
{
    "presets": [
        "@babel/preset-env", 
        "@babel/preset-react",
    ]
}
  • 我们一般用命令行来启动开发环境的运行,或者打包的。这个还要配置的,就在package.json里增加
//package.json
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
+   "dev": "webpack-dev-server --config config/webpack.dev.js --open", //开发环境,根据config文件夹下的webpack.dev.js文件的配置,--open这个是自动开启浏览器
+   "build": "webpack --config config/webpack.prod.js"//生产环境,根据config文件夹下的webpack.prod.js文件的配置
  },

webpack配置差不多到此为止了,如果还有问题的话,那就再回来改造~

开始react的表演

程序员通常喜欢用Hello World来开始的,那么我也从Hello React开始,看看webpack的配置对不对

  • 首先在项目的根目录下新建public,放index.html
//index.html
<!DOCTYPE html>
<html lang="en">
    <head>
        <title>react demo</title>
    </head>
    <body>
        <div id="root"></div>
    </body>
</html>

有没有发现,我还没引用bundle.js。然后这就需要在wbepack里配置

//webpack.common.js
  devServer:{ //利用上面的webpack-dev-server插件
     port:1234 //端口号,默认是8080,8080这个端口号很容易被占用,前端应该不常出现。反正我喜欢设置1234
  },

//新增的代码块
+ plugins:[
+     new HtmlWebpackPlugin({
+            template:'public/index.html',//指定的html模板,这个会自动帮我引用下面output出口设置的文件名。
+     })
+ ],
  • 在项目的根目录下新建src文件夹,然后再新建index.js文件
//index.js
import React from 'react';
import ReactDOM from 'react-dom';

ReactDOM.render(
    <h1>Hello React.js</h1>,
    document.getElementById('root'), 
)

应该差不多了,那就试试yarn start(package.json中的start)

yarn start

然后浏览器就会自动开启,就能看到大大的“Hello React”。

yarn build

就能看到dist的文件夹,这个是打包后的文件夹,可以看看html的代码,会发现多了一个script的引用,是html-webpack-plugin的作用。

零配置的搭建就到此为止,后会有期~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容