react-webpack

1、安裝webpakck

npm install --save-dev webpack webpack-cli

剛剛安裝的版本是 5.73.0

2、新建config配置文件夾

在根目錄下創(chuàng)建一個webpack.config文件夾,在此文件夾下創(chuàng)建三個配置文件

  • webpack.common.config.js -- 公共配置文件
  • webpack.prod.config.js -- 生產(chǎn)環(huán)境配置文件
  • webapck.dev.config.js -- 開發(fā)環(huán)境配置文件

在根目錄下再創(chuàng)建一個src文件夾,新建 app.js文件

3、在webpack.common.config.js文件中輸入以下代碼

const path = require('path');

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

4、安裝webpack-merge

用于合并webpack配置

npm install --save-dev webpack-merge

5、配置開發(fā)環(huán)境,生產(chǎn)環(huán)境webpack

const path = require('path');

module.exports = {
    entry: {
        app: './src/app.js'
    },

    output: {
        filename: 'js/bundle.js',
        path: path.resolve(__dirname, '../dist')
    }
}

6、安裝React

npm install --save react react-dom

7、修改app.js

import React, { Component } from 'react';

class App extends Component {
  render() {
    return (
      <div>my-project!!!!!</div>
    );
  }
}

export default App;

8、在src下新增index.js,代碼如下

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

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

9、修改webpack.common.js配置文件入口為:index.js

10、安裝bable

npm install --save-dev babel-loader @babel/core @babel/preset-env @babel/preset-react @babel/plugin-proposal-class-properties @babel/plugin-transform-runtime

各個bable的作用:

  • babel-loader:使用 Babel 和 webpack 來轉(zhuǎn)譯 JavaScript 文件。
  • @babel/core:babel 的核心模塊
  • @babel/preset-env:轉(zhuǎn)譯 ES2015+的語法
  • @babel/preset-react:轉(zhuǎn)譯 react 的 JSX
  • @babel/plugin-proposal-class-properties:用來編譯類(class)
  • @babel/plugin-transform-runtime:防止污染全局,代碼復用和減少打包體積

11、在webpack.common.js加入bable配置

const path = require('path');

module.exports = {
    entry: {
        app: './src/index.js'
    },

    output: {
        filename: 'js/bundle.js',
        path: path.resolve(__dirname, '../dist')
    },
    module: {
        rules: [
            {
                test: /\.(js|jsx)$/,
                exclude: /(node_modules|bower_components)/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-env', '@babel/preset-react'],
                        plugins: [
                            '@babel/plugin-transform-runtime',
                            '@babel/plugin-proposal-class-properties'
                        ]
                    }
                }
            }
        ]
    }
}

12、安裝HtmlWebpackPlugin

npm install --save-dev html-webpack-plugin

13、配置webpack.config.js

const { merge } = require('webpack-merge');

const common = require('./webpack.common.config');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = merge(common, {
    mode: 'production',
    plugins: [
        new HtmlWebpackPlugin({
            template: './public/index.html',
            filename: 'index.html',
            inject: 'body',
            minify: {
                removeComments: true
            }
        })
    ]
})
  • template:基于我們自己定義的 html 文件為模板生成 html 文件
  • filename:打包之后的 html 文件名字
  • inject:將 js 文件注入到 body 最底部
  • minify:壓縮 html 文件時的配置
  • removeComments:去除注釋

14、生成文件添加hash值

    output: {
        filename: 'js/[name]-bundle-[hash:8].js',
        path: path.resolve(__dirname, '../dist')
    }
  • [name] 打包入口名稱
  • [hash] 哈希串默認長度為 20,:6 為取前六位

15、打包前清理dist目錄(新版本可以不引入插件)

npm install --save-dev clean-webpack-plugin

代碼如下:

const { merge } = require('webpack-merge');

const common = require('./webpack.common.config');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');

module.exports = merge(common, {
    mode: 'production',
    plugins: [
        new HtmlWebpackPlugin({
            template: './public/index.html',
            filename: 'index.html',
            inject: 'body',
            minify: {
                removeComments: true
            }
        }),
        new CleanWebpackPlugin()
    ]
})

注意:新版可配置output對象屬性clean為true,來清理

16、安裝webpack-dev-server

npm install -D webpack-dev-server

修改webpack.dev.js

const { merge } = require('webpack-merge');
const path = require('path')
const common = require('./webpack.common.config');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = merge(common, {
    mode: 'development',
    devServer: {
        // 新版本不再支持contentBase,而是使用static,路徑指定有問題
        // contentBase: path.join(__dirname, 'dist'),
        prot: 8888,
        compress: true,
        static: {
           directory: path.join(__dirname, '/public')
        }
    },
    plugins: [
        new HtmlWebpackPlugin({
            template: 'public/index.html',
            inject: 'body',
            hash: false
        })
    ]
})
  • contentBase: 啟服務的文件
  • port: 端口號
  • compress: 為每個靜態(tài)文件開啟[gzip壓縮]

17、樣式配置

安裝style-loader、css-loader

npm install --save-dev style-loader css-loader

新增配置

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

18、打包css

安裝插件

npm i -D mini-css-extract-plugin

配置打包

  module: {
        rules: [
            {
                test: /\.css$/,
                use: [MiniCssExtractPlugin.loader, 'css-loader']
            }
        ]
    },

在插件里面新增配置

 new MiniCssExtractPlugin({
     filename: 'style/[name].[hash].css'
 })

19、壓縮打包出來的css文件

安裝依賴

npm i -D css-minimizer-webpack-plugin

配置壓縮

    optimization: {
        minimize: true,
        minimizer: [new CssMinizerPlugin()]
    },

20、配置less、sass

安裝依賴

npm i less less-loader -D
npm i -D sass sass-loader node-sass

配置less,sass

           {
                test: /\.less$/,
                use: [
                    'style-loader',
                    'css-loader',
                    'less-loader'
                ]
            },
            {
                test: /\.s[ac]ss$/,
                use: [
                    'style-loader',
                    'css-loader',
                    'sass-loader'
                ]
            }

21、壓縮js代碼

下載插件

npm i -D terser-webpack-plugin

配置壓縮文件

    optimization: {
        minimize: true,
        minimizer: [
            new CssMinizerPlugin(),
            new TerserPlugin({
                terserOptions: {
                    compress: {
                        drop_console: true
                    }
                }
            })
        ]
    },

22、配置css瀏覽器前綴

安裝依賴

npm i -D postcss postcss-loader autoprefixer

在根目錄,新增postcss.config.js文件,代碼如下:

module.exports = {
    plugins: [
        require('autoprefixer')({
            overrideBrowserslist: [
                'Android 4.1',
                'iOS 7.1',
                'Chrome > 31',
                'ff > 31',
                'ie >= 8',
            ]
        })
    ]
};

在css-loader后面新加postcss-loader

23、配置圖片load,使用url-loader

安裝url-loader,url-loader依賴于file-loader,所以需要安裝兩個loader

npm i -D file-loader url-loader

配置代碼

            {
                test: /\.(png|jpe?g|gif)$/,
                loader: 'url-loader',
                options: {
                    name: '[name].[ext]',
                    outputPath: 'images',
                    limit: 8192
                }
            }
  • 后綴為 jpg,png,gif 的文件,使用 url-loader 進行預處理;
  • options 中的[name].[ext]表示,輸出的文件名為 原來的文件名;
  • outputPath 是輸出到 dist 目錄下的路徑,即 dist/images;
  • limit: 8192,指定文件的最大體積(以字節(jié)為單位)。 如果文件體積等于或大于限制,默認情況下將使用 file-loader 并將所有參數(shù)傳遞給它。若是小于了 8kb,將圖片打包成 base64 的圖片格式插入到 bundle.js 文件中,這樣做的好處是,減少了 http 請求,但是如果文件過大,js 文件也會過大,得不償失,這是為什么有 limit 的原因。

24、配置source-map

devtool: 'eval-cheap-module-source-map',

25、配置resolve.alias

 resolve: {
        extensions: ['.js', '.jsx', '.json', '.less', '.scss'],
        modules: [ path.resolve(__dirname, '../src'), 'node_modules' ],
        alias: {
          '@': path.join(__dirname, '../src')
        }
      }
  • extensions: 如果有多個文件有相同的名字,但后綴名不同,webpack 會解析列在數(shù)組首位的后綴的文件 并跳過其余的后綴。使用此選項會 覆蓋默認數(shù)組,這就意味著 webpack 將不再嘗試使用默認擴展來解析模塊。
  • modules: 如果你想要添加一個目錄到模塊搜索目錄,此目錄優(yōu)先于 node_modules/ 搜索。
  • alias: 創(chuàng)建 import 或 require 的別名,來確保模塊引入變得更簡單。例如,一些位于 src/ 文件夾下的常用模塊
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容