我的react学习之行-01webpack与react环境搭建

Posted AlexKing阁下

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的react学习之行-01webpack与react环境搭建相关的知识,希望对你有一定的参考价值。

前言

预备自己使用webpack与react搭建前端与后端分离的博客系统,在这个git上记录我所有的步骤,以便自我学习与总结

基础环境

node/npm

webpack

用于打包的工具,目前使用的是4.0

npm install webpack webpack-cli --save-dev

这就是安装webpack,当然4.0开始在打包时需要安装cli,注意–save-dev就是安装在开发模式下的支援包,具体可以直接去看package.json这个文件又增加了什么

react与babel

首先安装react与react-dom,而且是浏览器中必须依赖的,因而后面要加–save

npm install react react-dom --save

此时,可以看到package.json中

 "devDependencies": 
    "babel-cli": "^6.26.0",
    "webpack": "^4.29.0",
    "webpack-cli": "^3.2.1"
  ,
  "dependencies": 
    "react": "^16.7.0",
    "react-dom": "^16.7.0"
  

很明显dev开头的就是我们的开发模式。而dependcies就是我们正常的依赖,所以在此可以知道加–save-dev与–save的区别了。

es5与es6

随着javascript的发展,语法有了越来越多的新特性,但是你的浏览器就不一定是支持最新特性的代码,那么babel就应运而生,用于进行es6转换成es5,如es6中的箭头函数就会被转化成es5可以认识的函数等等。

npm i @babel/core babel-loader @babel/preset-env @babel/preset-react --save-dev

由于我使用的是webstorm进行编辑的,那么可以使用babel官网提到的cli,具体请点链接

npm install --save-dev babel-cli

主要直接用命令行转码。

配置并启动babel

别忘了配置Babel!在项目文件夹中创建一个名为 .babelrc 的新文件


  "presets": ["@babel/preset-env", "@babel/preset-react"],
  "plugins": []

在config创建一个名为 webpack.config.js 的文件,写入

const path = require('path') //用于得到绝对路径

const config = 
    entry:
        blog:path.resolve(__dirname,'../src/app.js') //入口的源代码
    ,
    output:
        filename:'[name].js',
        path: path.resolve(__dirname,'../output'),//输出的源代码
        //publicPath:''
    


module.exports = config//这个一定不能忘记加

这样就是webpack最简单的打包工程。

那么还需要的是如何运用babel-loader将js文件自动适配,于是在webpack.config.js中就需要创建一个规则来做这件事情。在webpack.config.js添加:

output:
        filename:'[name].js',
        path: path.resolve(__dirname,'../output'),//输出的源代码
        //publicPath:''
    ,
module:
        rules:[
            
                test: /\\.js$/,
                exclude: /node_modules/,
                use: 
                    loader:"babel-loader" //使用babel-loader将es6转换成ES5语法
                

            
        ]
    ,

此时已经可以把babel-loader用起来,让webpack可以识别js文件并通过babel-loader识别转换

package.json添加webpack打包命令

"scripts": 
    "test": "echo \\"Error: no test specified\\" && exit 1",
    "build": "webpack --config config/webpack.config.js --mode development",
    "release": "webpack --config config/webpack.config.js --mode production"
  ,

分别执行两个操作,你会发现main.js不同的变化。production模式下,默认对打包的文件压缩,打包更小。development模式下,对打包的文件不压缩,同时打包的速度更快,webpack更新的优点就在这里。
如果没有指定任何模式,默认为production模式。

注意:–config 配置文件路径,字符串格式,默认是根目录下的 webpack.config.js 或 webpackfile.js,

html-webpack-plugin 和 html-loader

要显示React的页面,我们必须告诉Webpack生成一个HTML页面,同时将生成的打包出来的js将放在 标签内。这就需要webpack的插件html-webpack-plugin了

npm i html-webpack-plugin html-loader --save-dev

首先我们先创建一个模版文件index.html,放在public文件夹中。

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>New React App</title>
</head>
<body>
<div id="root"></div>
</body>
</html>

可以看到我们的div组件中的id为root,目标就是替换掉这里面的内容。
,那么首先得知道如何使用这个插件。

在webpack中申明插件

const HtmlWebPackPlugin = require("html-webpack-plugin");

在webpack中添加插件配置

 plugins:[
        new HtmlWebPackPlugin(
            // title:"",//设置生成的html文件的标题
            filename: path.resolve(__dirname,'../output/index.html'),//生成的html文件名
            template: path.resolve(__dirname,'../public/index.html'),//根据自己指定的模版文件生成特定的html文件
            favicon: path.resolve(__dirname,'../static/favicon.ico'),//属性值为favicon文件所在的路径
        )
    ],

具体可以参考本文

同时还要注意在webpack中的model rule,打包的时候要认到html文件,就需要使用html-loader

 
       test:/\\.html$/,
         use: [
             
                loader: "html-loader",
                        options: minimize:true
                 
            ]
  

minimize指是否要缩,这个去掉就是原来没有压缩过的html。

添加react源码

环境都已经准备好了,那么现在要做的是将react建立起来,在目录下建立src文件夹用于存放react源码。

还记得我们在webpack的配置吗?在配置其入口函数的时候,entry所用的就是index.js,所以在这里新建index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './app';

ReactDOM.render(<App />, document.getElementById('root'));

在这里我们可以看到源码中去找的是dom中的root,即html中的div组件id。
而真正的入口函数在app.js

import React,  Component  from 'react';
class App extends Component 
  render() 
    return (
      <div>
          helloword!
      </div>
    );
  


export default App;

于是一个helloworld正式可以用了。

webpack-dev-server

如何进行自动的debug是我们开发周期中需要运用到的,特别是前端,我们先要看效果。而且每次都编译一遍实在是效率低下,于是产生了一个新的插件。

npm i webpack-dev-server --save-dev

那么如何设置呢。可以参考官方网站

devServer:
        contentBase:path.resolve(__dirname,'../output'),
        compress:true,
        port:8000,
        host:'127.0.0.1',
        hot:true,
        overlay:
            errors: true
        ,
    

在package.json中添加命令
“start”:“webpack-dev-server --config config/webpack.config.js --mode development --hot --inline”

注意,因为webpack-dev-server是直接找当前内存中的

import React, Component from 'react';
import './style.css';
import Header from '../../components/Header/Header';
import Menus from '../../components/Menus/Menus';
import 'antd/dist/antd.css';

class Home extends Component
    render() 
        return(
            <div className='container' >
                <Header/>
                <div className="nav">
                    <Menus />
                </div>
                <div className="main">
                    这里是文章列表
                </div>
            </div>
        );
    



export default Home;

上面是我写好的代码,来解析一波。
首先我们得设计一个header。header属于一个组件,在这里不详细说react的组件化思想了,后续再跟大家唠。
新建一个组件文件夹写入


以上是关于我的react学习之行-01webpack与react环境搭建的主要内容,如果未能解决你的问题,请参考以下文章

如何将 webpack 与 create-react-app 一起使用?

我的react学习之行-03如何设计高质量的React组件

我的react学习之行-03如何设计高质量的React组件

webpack+react+es6开发模式

react学习笔记之环境配置

webpack+react 环境