高效学习三部曲:webpack

100 阅读3分钟

基本配置

  • 拆分配置和merge

高级配置

优化打包效率

优化产出代码

构建流程概述

babel

面试题

前端代码为何要进行构建和打包?

module chunk bundle 分别什么意思,有何区别?

loader和plugin的区别?

webpack如何实现懒加载?

webpack常见性能优化

babel-runtime和babel-polyfill的区别

主要配置

yarn add webpack@3.10.0 webpack-dev-server@2.9.7 --dev
yarn add html-webpack-plugin@2.30.1 --dev
yarn add babel-core@6.26.0 babel-preset-env@1.6.1 babel-loader@7.1.2 --dev
yarn add babel-preset-react@6.24.1 --save
yarn add react@16.2.0 react-dom@16.2.0 --save
yarn add style-loader@0.19.1 css-loader@0.28.8 --dev
yarn add extract-text-webpack-plugin@3.0.2 --dev
yarn add sass-loader@6.0.6 node-sass@4.7.2 --dev
yarn add file-loader@1.1.6 url-loader@0.6.2 --dev
yarn add font-awesome
yarn add webpack-dev-server@2.9.7 --dev

————————————
yarn add webpack webpack-dev-server --dev
yarn add html-webpack-plugin babel-core babel-preset-env babel-loader --dev
yarn add babel-preset-react react react-dom --save
yarn add style-loader css-loader extract-text-webpack-plugin sass-loader node-sass --dev
yarn add file-loader url-loader webpack-dev-server --dev
yarn add font-awesome
yarn add webpack-cli   html-loader

yarn add react-router-dom axios less-loader less antd babel-plugin-import
yarn add jsonp less@^2.7.3 moment --save(jsonp跨域 同源策略 协议 域名 端口,三个都一样才能保证不跨域)
//创建一个React项目需要的依赖
yarn add react react-dom webpack webpack-cli webpack-dev-server html-webpack-plugin html-loader
yarn add @babel/core babel-loader @babel/preset-env @babel/preset-react --save-dev

yarn add react-router-dom axios less-loader less antd babel-plugin-import
yarn add jsonp less@^2.7.3 moment --save(jsonp跨域 同源策略 协议 域名 端口,三个都一样才能保证不跨域)

不用脚手架怎么搭建react项目?

// 生成 package.json 文件
npm init

//安装需要的依赖
npm install --save react (安装React)
npm install --save react-dom  (安装React Dom)
npm install --save-dev webpack  (安装webpack,打包工具)
npm install --save-dev webpack-cli  (使用 webpack 4+ 版本,还需要安装 webpack-cli)

(安装webpack-dev-server,一个小型express服务器,主要特性是支持热加载) 
npm install --save-dev webpack-dev-server  

(webpack需要两个额外的组件来处理HTML:html-webpack-plugin和html-loader)
npm install --save-dev html-webpack-plugin html-loader

安装过webpack后需要修改 package.json 文件的内容

"scripts": {
    "start": "webpack-dev-server --open --mode development",
    "build": "webpack --mode production"
}

新建一个 webpack.config.js 文件

const HtmlWebPackPlugin = require("html-webpack-plugin");
 
module.exports = {
    module: {
        rules: [
            {
                test: /\.(js|jsx)$/,
                exclude: /node_modules/,
                use: {
                    loader: "babel-loader"
                }
            },
            {
                test: /\.html$/,
                use: [
                    {
                        loader: "html-loader"
                    }
                ]
            }
        ]
    },
    plugins: [
        new HtmlWebPackPlugin({
            template: "./index.html",
            filename: "./index.html"
        })
    ]
};

安装babelbabel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行

npm install --save-dev @babel/core

(webpack并不知道如何将ES6语法转换为ES5,不过 webpack 可以使用 loader 来完成。即webpack加载器将一些东西作为输入,并将其转换为其他东西输出。)
npm install --save-dev babel-loader  

npm install --save-dev @babel/preset-env  (将ES6语法转码为ES5)
npm install --save-dev @babel/preset-react (将JSX语法转化为JavaScript)

新建一个配置文件.babelrc写入以下内容

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

在根目录下新建一个 index.html 写入以下内容

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>new react project</title>
</head>
<body>
    <div id="app"></div>
</body>
</html>

新建一个 src 文件夹,在src文件夹下新建一个 index.js 写入以下内容

import React from 'react';
import ReactDom from 'react-dom';
 
class App extends React.Component {
    render() {
        return (
            <h1>
                Hello World !
            </h1>
        )
    }
}
 
ReactDom.render(
    <App />,
    document.getElementById('app')
);
运行`npm start`即可在浏览器访问页面。
运行`npm run build`时,会出现一个dist文件夹,文件夹中包含有一个html和一个js文件,是打包后的文件。