likes
comments
collection
share

从零配置webpack + react

作者站长头像
站长
· 阅读数 22

虽然说现在创建一个react项目,打包的配置都是已经配置好了的,只需要我们运行相应的打包命令就行了,但是我们还是很有必要知道该怎么来配置打包需要的配置。

下面就让我们来走一遍webpack打包react项目的整个过程吧。

创建一个React项目

这里就不使用 create-react-app 指令创建React项目了,因为用create-react-app创建的项目,里面的配置已经配置好了。

本文就直接使用 yarn init 初始化

从零配置webpack + react

并创建下面的目录结构:

从零配置webpack + react

从零配置webpack + react

从零配置webpack + react

安装webpack

使用

yarn add webpack webpack-cli --dev

--dev 是局部安装的意思,为什么是局部安装呢?

因为并不是所有项目都需要使用 webpack ,所以只需要在需要使用的项目里面安装就行了;

但最主要的原因还是,如果全局安装 webpack 的话,一个其他使用者在使用这个项目的时候,他的电脑没有全局安装 webpack ,那么将运行不起来,但如果是局部安装的话,其他使用者只需要在开始 install 一次就行了。

使用 npx webpack -h查看是否安装成功

从零配置webpack + react

因为是局部安装,因此 webpack 是在依赖包里的,对于它们命令的执行,要进入依赖包才行,否则是被认为命令无效的。或者,使用npx会自动找到对应的包执行命令,它是一个 npm 包执行器,一般安装了 npm 会自动安装 npx,总之,有了这个工具,执行局部的 webpack 命令就没那么冗长了。

在根目录下添加webpack.config.js配置文件

const path = require('path');

module.exports = {
    entry: './src/index.js',
    output: {
        path: path.resolve(__dirname, 'dist')
    }
}

使用 npx webpack对项目进行打包处理

从零配置webpack + react

可以在项目目录下面发现打包好的 dist文件夹

index.html文件中引入打包好的dist中的 main.js文件,并运行 index.html文件,可以在浏览器的控制台中看到打印了 hello world

从零配置webpack + react

我们可以使用插件来生成html文件,这样就避免了html每次去手动引入js;使用插件来删除上次打包的结果。

// 安装依赖
yarn add --dev html-webpack-plugin clean-webpack-plugin

webpack.config.js中使用插件

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');

module.exports = {
    entry: './src/index.js',
    output: {
        path: path.resolve(__dirname, 'dist')
    },
    plugins:[
        new HtmlWebpackPlugin({template:'./public/index.html'}),
        new CleanWebpackPlugin()
    ]
}

从零配置webpack + react运行dist中的index.html文件

从零配置webpack + react

这里打印了两次,是因为原来在 public/index.html中引入了一次 main.js,打包的时候又引入了一次,所以一共引入了两次,所以打印了两次 hello world

更多关于webpack的配置说明可以webpack官网

React使用webpack

基本配置

下载 reactreact-domreact-scripts

yarn add react react-dom react-scripts

修改 index.js文件,添加 App.js文件

从零配置webpack + react

从零配置webpack + react

package.json文件中加入:

"scripts": {
    "start": "react-scripts start"
}

运行 yarn start ....报错

从零配置webpack + react

发现是安装的 react 的包里面的 webpack和自己安装的 webpack包的版本冲突了

降低安装的 webpack包的版本:

删除 node_modulesyarn.lcok,修改 package.json里面 webpack的版本为 4.44.2

重新下载好后,cnpm start没问题!

但是使用 npx webpack,又报错!

从零配置webpack + react

检查一圈发现是 html-webpack-plugin插件版本问题。

yarn remove html-webpack-plugin

yarn add --dev html-webpack-plugin@^3.2.0

下载好之后运行 npx webpack

从零配置webpack + react

这是因为不支持JSX语法包的错,所以需要去配置 loader

babel的官网,看看如何配置jsx语法loader

下载

yarn add --dev @babel/preset-react babel-loader @babel/core

webpack.config.js加入 loader配置

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');

module.exports = {
    entry: './src/index.js',
    output: {
        path: path.resolve(__dirname, 'dist')
    },
    plugins:[
        new HtmlWebpackPlugin({template:'./public/index.html'}),
        new CleanWebpackPlugin()
    ],
    module: {
        rules: [
            {
                test: /\.(js|jsx|ts|tsx)$/,
                exclude: /(node_modules)/,
                use: [
                    {
                        loader: 'babel-loader',
                        options: {
                            presets: ['@babel/preset-react']
                        }
                    }
                ]
            }
        ]
    }
}

从零配置webpack + react

CSS配置

继续配置 css需要的配置

创建 App.css文件,并引入

// App.js
import React, { PureComponent } from 'react';
import './App.css';

class App extends PureComponent{
    constructor(props){
        super(props);
        this.state = {};
    }

    render(){
        return (
            <div className='hello'>Hello World!</div>
        )
    }
}
export default App;
// App.css
.hello {
    color: red;
}

下载 style-loadercss-loader,这里要特别注意 loader的版本问题,可以使用 npm ls style-loader 查看 react安装好了的loader是什么版本的(因为下载了 react-scripts,这个包里面也有打包功能,所以里面肯定配置了 style-loader,css-loader这些loader的),我们就安装多少版本的。

从零配置webpack + react

从零配置webpack + react

使用

yarn add --dev style-loader@1.3.0 css-loader@4.3.0

webpack.config.js中加入配置

{
    test: /\.css$/i,
    use: ['style-loader', 'css-loader']
}

配置好后,npx webpack打包,运行 dist/index.html,发现 Hello World字体颜色为红色。

从零配置webpack + react

在控制台调试发现,css样式的引入是在head插入的,当项目变大时样式直接插入head中的方式并不好,我们需要将样式分离

使用 mini-css-extract-plugin插件,它会将 CSS 提取到单独的文件中,为每个包含 CSS 的 JS 文件创建一个 CSS 文件,并且支持 CSS 和 SourceMaps 的按需加载。

下载 mini-css-extract-plugin

yarn add --dev mini-css-extract-plugin@0.11.3

webpack.config.js配置 mini-css-extract-plugin

plugins: [
    ...
    new MiniCssExtractPlugin({
        // Options similar to the same options in webpackOptions.output
        // both options are optional
        filename: "[name].css",
        chunkFilename: "[id].css"
    })
]

module: {
    rules: [
        {
            test: /\.css$/,
            use: [
                {
                    loader: MiniCssExtractPlugin.loader,
                    options: {
                    // you can specify a publicPath here
                    // by default it use publicPath in webpackOptions.output
                    publicPath: '../'
                    }
                },
                "css-loader"
            ]
        }
    ]
}

从零配置webpack + react从零配置webpack + react

配置img、font、map3等资源的loader

使用 url-loader,它的功能类似于 file-loader, 但是在文件大小(单位为字节)低于指定的限制时,可以返回一个 DataURL

yarn add --dev url-loader@4.1.1
// App.css
.hello {
    color: red;
    background: url('./assets/backgroud2.jpg') no-repeat center;
    background-size: cover;
    height: 100vh;
}

webpack.config.js添加配置

{
    test: /\.(jpg|png|gif)$/,
    loader: 'url-loader',
    options: {
        limit: 1000,
        name: 'static/img/[name].[hash:7].[ext]'
    }
}

从零配置webpack + react

运行 dist/index.html报如下错误:

从零配置webpack + react

这是因为本地没有启动web服务,所以浏览器访问不了本地的资源,这是正常的。

其他资源的配置和上面的差不多,这里就不做介绍了。

参考资料:

使用webpack4从零配置react项目