webpack

定义

Webpack是一个前端构建工具,可以将所有资源(包括Javascript,图像,字体和CSS等)打包后置于依赖关系中,使你可以按照需求引用依赖来使用资源。其实也就是模块打包器。

核心概念

  • 入口 entry webpack导入文件的起点
  • 出口 output 导出到哪
  • 插件 plugin 处理事情
  • 加载器 loader 加载处理特殊文件

webpack如何实现跨域

devServer:{
proxy:{
xxx:{}
}
}

webpack loader和plugin的区别

loader用于加载并处理文件
Plugin 扩展功能

插件 加载器

css-loader:     处理和分析css依赖
html-webpack-plugin:   把css插入到header文中

less
less-loader: 处理less文件
mini-css-extract-plugin: 把css抽出为一个单独的文件
optimize-css-assets-webpack-plugin: 优化css和css资源
style-loader: 处理html模板
webpack: webpack本地服务器
webpack-cli: webpack
webpack-dev-server: webpack脚手架

浏览器缓存(强缓存)

当用户去请求页面的时候,会去请求很多文件。如果请求的文件名称,地址,在浏览器的缓存列表里面存在,那么浏览器就不会发起http请求,直接从缓存里面读取(提高二次加载速度);
一个域名有两个页面,先访问A页面,需要xxx.js,B页面也需要xxx.js,由于之前访问过A,xxx.js已经存在,直接从缓存中读取文件,提高页面的加载数据;

webpack实现功能

当文件内容都发生改变了,生成的文件名要变化,当内容没有发生改变,保存文件名一致。

webpack魔法名称

[hash:7]每次构建项目 创建的标识符(取7位)
[contenthash]每次根据内容创建的标识符
[name]文件名称
[ext]文件的后缀名

webpack如何实现按需加载

import(xxx)
.then(res=>{})

webpack如何加载字体文件

file-loader
url-loader + 可以把小文件转base64

babel用途是什么?

ES6/7 转化为浏览器可以识别的js语法

polufill的作用是什么?

ES6转ES5

图片与文件处理

  • file-loader 解析项目中url引入,使它指向正确的文件;
  • url-loader 会将小图片生成base64编码格式;
  • image-webpack-loader 插件可以将大图进行压缩,从而缩小打包体积;
  • html-loader html代码里处理img标签的loader;
    [代码如下]:
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports={
    devServer: {
        contentBase: './dist',
     },
    optimization: {
        minimizer: [ new OptimizeCSSAssetsPlugin({})],
      },  
    // mode:'production',
    entry:'./src/index.js',
    output:{
        filename:'main-[hash].js',
        path:__dirname+'/dist'
    },
    module:{
        rules:[
            
            {
                test: /\.(png|jpg|gif|jpeg|ico)$/,
                use:[{loader:'url-loader',options:{limit:50000,name: 'img/[name].[hash:5].[ext]'}},'image-webpack-loader']
            },
            {
                test:/\.css$/,
                use:[MiniCssExtractPlugin.loader,/* 'style-loader', */'css-loader']
            },
            {
                test:/\.(eot|woff2|woff|ttf|svg)/,
                use:[{loader:'url-loader',options:{limit:10,name: 'font/[name].[hash:5].[ext]'}}],
            },
            {
                test:/\.less$/,
                use:[MiniCssExtractPlugin.loader,/* 'style-loader', */'css-loader','less-loader']
            }
        ]
    },
    plugins:[
        new CleanWebpackPlugin(),
        new HtmlWebpackPlugin({
            template:'./src/index.html'
        }),
        new MiniCssExtractPlugin({
            filename: 'style.css',
            
          }),
    ]
}

babel与react

@babel/core-babel核心模块
@babel/preset-env-编译ES6等
@babel/preset-react-转换JSX

cnpm i babel-loader @babel/core @babel/preset-env  @babel/plugin-transform-runtime   @babel/preset-react -D

 @babel/plugin-transform-runtime: 避免 polyfill 污染全局变量,减小打包体积
 @babel/polyfill: ES6 内置方法和函数转化垫片
 
cnpm i @babel/polyfill @babel/runtime -D

main.js如下

import ReactDom from 'react-dom'
import React,{Component} from 'react'
class App extends Component{
    constructor(props){
        super(props);
        this.state={num:1}
    }
    render(){
        return (
react
) } } ReactDom.render(,document.getElementById("root"))

webpack.config.js如下:

{ 
    test: /\.(js|jsx)$/, 
    use:['babel-loader'],
    exclude: /node_modules/ 
},

.bablerc如下:

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

压缩

  • optimize-css-assets-webpack-plugin css优化压缩
  • uglifyjs-webpack-plugin js压缩

代码分割

optimization: {
    splitChunks: {
        chunks: "all", 
        // 所有的 chunks 代码公共的部分分离出来成为一个单独的文件},
}, 

sourceMap

可以知道源代码在哪一行错误,sourceMap是一个map关系;

Prefetch

Prefetch是告诉浏览器这是一个在未来可能使用到的资源。 浏览器通常会在空闲状态取得这些资源,在取得资源之后搁在HTTP缓存以便于实现将来的请求


总结:
webpack中特殊的文件名称写法:
[hash:7] 哈希值7位
[contenthash]内容哈希
[name]原来的名字
[ext] 后缀名

用来清理dist文件夹
const {CleanWebpackPlugin} = require(' clean-webpack-plugin')

自动补齐前缀
postcss-loader
{loader:' postcss-loader',
options:{
plugins:[require(' autoprefixer')]
}
}

加载文件-小文件base64
filter-loader
{loader:' url-loader' ,options:limit:2000,name:img/[namel].hash:5].[ext] ,esModule: false}
limit大小限制
esModule导入内容模块为false

压缩图片
image-webpack-loader

你可能感兴趣的:(webpack)