使用Webpack初始化一个React项目

2,737 阅读5分钟

一、安装和使用Webpack

1. 初始化项目

mkdir jianshu-react 
cd jianshu-react
npm init -y
2.安装Webpack
npm install -D webpack webpack-cli

npm i -Dnpm install --save-dev 的简写,是指安装模块并保存到 package.json 的 devDependencies中,主要在开发环境中的依赖包。

3. 新建文件,初始化项目目录

在根目录下新建 src 文件夹,在 src 文件夹下,新建index.js文件,文件中书写以下代码:

document.querySelector('#root').innerHTML = 'Hello jainshu-react';

在根目录下新建 dist 目录,在 dist 目录下,新建index.html文件,文件中书写以下代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="root"></div>
<script src="bundle.js"></script>
</body>
</html>

最终的代码结构如下:

二、配置Webpack和构建本地开发服务器

在根目录下创建 webpack.config.js 配置文件,在里面书写以下配置代码:

const path=require('path');
module.exports={
    entry:'./src/index.js',
    output:{
        filename:'bundle.js',
        path:path.resolve(__dirname,'dist'),
        publicPath: '/'		// 配置引入便宜后的文件的路径,这里配置为服务器下的根路径
    }
};

package.json 文件中添加一条script脚本命令:

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack --mode production"	// 新增的脚本命令
},

现在我们就可以运行npm run build来对项目进行打包编译了。

为了我们开发的便捷,一般情况下我们都是需要借助Webpack来构建一个本地开发服务器,方便实时调试代码。构建本地开发服务器,首先使用以下命令安装webpack-dev-server :

npm i -D webpack-dev-server

安装完成之后,修改webpack.config.js中的配置:

const path = require('path');
module.exports = {
    entry: './src/index.js',
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'dist')
    },
    /*----以下是新增的配置代码----*/
    devServer: {
        contentBase: "./dist",      // 本地服务器所加载的页面所在的目录
        historyApiFallback: true,   // 不跳转
        inline: true,               // 实时刷新
        port: 3000,                 // 项目所使用的端口
        open: true,                 // 自动打开浏览器
    }
};

package.json 文件中添加一条script脚本命令,用来进行开启本地开发服务器:

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "webpack --mode production",
    "start": "webpack-dev-server --mode development"	// 新增的命令
},

现在我们就可以运行npm run start,就可以通过 localhost:3000/ 来访问我们的项目了。

三、配置HTML模板

配置HTML模板之前,首先改变一下我们之前的代码目录结构,具体的操作就是将 /dist/index.html 文件,移动到 src 目录下,如下图所示:

然后执行以下命令,安装html-webpack-plugin 插件:

npm i html-webpack-plugin -D

安装完成之后,修改 webpack.config.js文件中的配置:

const path = require('path');
let webpack=require('webpack');
let HtmlWebpackPlugin=require('html-webpack-plugin');	// 引入插件
module.exports = {
    entry: './src/index.js',
    output: {
        //添加hash可以防止文件缓存,每次都会生成4位hash串
        filename: 'bundle.[hash:4].js',
        path: path.resolve('dist')
    },
    devServer: {
        contentBase: "./dist",
        historyApiFallback: true,
        inline: true,
        port: 3000,
        open: true,
    },
    /*----以下是新增的配置代码----*/
    plugins: [
        new HtmlWebpackPlugin({
            template: './src/index.html',
            hash: true,         //会在打包好的bundle.js后面加上hash串
        })
    ]
};

关于HTML模板的详情,大家可以参考之前的一篇博客:webpack入门学习笔记04 —— 安装和配置webpack开发服务器

配置完成之后,就可以执行 npm run build进行打包编译了,打包后会在 dist 目录下生成 html文件和js文件。但是现在每次进行打包编译,dist 目录之前生成的文件不会被删除。这些文件留着又没有什么用处,所以可以进行以下配置,每次打包编译之前,首先将dist 目录下的文件给删除,然后再生成新的文件。

执行以下命令安装clean-webpack-plugin 插件:

npm i clean-webpack-plugin -D

安装完成之后,修改 webpack.config.js文件中的配置:

const path = require('path');
let webpack = require('webpack');
let HtmlWebpackPlugin = require('html-webpack-plugin');
let { CleanWebpackPlugin } = require('clean-webpack-plugin');	// 引入插件
module.exports = {
    /* 其他配置和上面一样 */
    plugins: [
        new HtmlWebpackPlugin({
            template: './src/index.html',
            hash: true, 
        }),
        new CleanWebpackPlugin() //打包前先清空
    ]
};

四、配置Babel,编译ES语法和JSX语法

这是很重要的一个环节,也是很容易出错的一个环节,可能会出现你按照网上的一些教程进行配置,结果还是会报错的情况。这是因为Babel版本的问题。

现在Babel版本是7.x,安装和配置方式和之前的版本有所不一样。所以如果你配置完成之后,编译项目还是会出错,可以百度相关错误,或者到Babel官网查看相应的安装和配置方式。

执行以下命令,安装所需要的插件和工具:

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

安装完成之后,在项目根目录下新建 .babelrc 配置文件(注意文件名之前需要带有点),配置代码如下:

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

然后修改 webpack.config.js文件中的配置:

/* 其他配置和上面一样 */
module.exports = {
    module:{
        rules:[
            {
                test:/\.(jsx|js)$/,
                exclude:/(node_modules)/,  //排除掉nod_modules,优化打包速度
                use:{
                    loader:'babel-loader'
                }
            }
        ]
    }
};

五、配置React,编写 React 组件

想要使用React语法编写组件,首先要安装React,安装命令如下:

npm i react react-dom -S

安装完成之后,我们就可以开开心心地编写React代码了。现在 src 目录下新建一个 App.jsx 文件,在里面书写以下代码:

import React from 'react';
class App extends React.Component{
    render(){
        return (
            <div>Hello, jianshu - react</div>
        );
    }
}
export default App;

然后修改 src/index.js 文件中的代码,代码如下:

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App.jsx';
ReactDOM.render(
    <App/>,
    document.getElementById('root')
);

现在执行 npm run start 就可以通过 localhost:3000/ 访问我们编写的React项目了,也就是说从现在开始,我们就可以正常地编写React代码了。

六、配置SASS处理规则

我们准备在项目中使用SASS这一CSS预处理器,所以还需要配置SASS的处理规则。首先使用以下命令安装所需要的工具:

npm install style-loader css-loader url-loader --save-dev
npm install sass-loader node-sass --save-dev
npm install --save-dev mini-css-extract-plugin 

全部安装完成之后,进行修改 webpack.config.js文件中的配置:

/* 其他配置和上面一样 */
let MiniCssExtractPlugin=require("mini-css-extract-plugin");
module.exports = {
    plugins: [
        /* 提取单独打包css文件 */
        new MiniCssExtractPlugin({
            filename: "[name].css",
            chunkFilename: "[id].css"
        })
    ],
    module:{
        rules:[
            {
                test:/\.(png|jpg|gif)$/,
                use:[
                    "url-loader"
                ]
            },
            {
                test:/\.(scss|css)$/,
                use:[
                    "style-loader",
                    "css-loader",
                    "sass-loader"
                ]
            }
        ]
    }
};

七、写在最后

到这里,我们就完成了React的初始化工作,下面就可以开始我们的React简书项目之旅了。

最后还是要提醒一点,如果大家按照上面的步骤一步一步操作,结果在编译项目的时候,控制台报出了一些错误,这可能是因为第三方包版本升级导致,或者是以为你使用了比较新的语法,需要额外地loader进行处理。

如果遇到此类问题,大家可以自行百度一下相关错误信息,相信一定可以找到解决方案。