webpack学习

1.webpack

项目-----》装载器------》插件------》浏览器

loader:将浏览器不能识别的文件转化为html,js,css

插件:对文件进行处理像压缩,合并等

入口:

出口:

创建webpack

webpack init -y

webpack零配置打包

npx webpack

只打包js文件生成main.js

webpack指定配置

默认入口: src/index.js

默认出口: dist/main.js

插件

html-webpack-plugin:

plugins:[

new htmlWebpackPlugin({

template:'./src/index.html',//指定输出得文件模板

filename:'main.html'//指定输出的文件名

})

]

webpack-dev-server:

配置:

"scripts": {

"dev":"webpack serve",

"test": "echo \"Error: no test specified\" && exit 1"

},

在webpack.config.js中配置

使用命令 npm run dev

webpack默认只支持js,不支持css

需要css-loader

style-loader: 将css直接添加到html的script标签中

装载器的执行顺序从右到左

module:{

rules:[

{

test:/\.css/,

use:['style-loader','css-loader']

}

]

}

加载多个css文件在index.css中可以导入别的样式文件也能打包

@import './color.css';

body{

background: red;

}

less-loader

{

test:/\.less/,

use:['style-loader','css-loader','less-loader']

}

@import './color.css';

@import './index.less';

body{

background: red;

}

抽取css作为一个文件 css文件抽取器

插件: mini-css-extract-plugin

使用:

const cssMiniExtractPlugin = require('mini-css-extract-plugin')

plugins:[

new htmlWebpackPlugin({

template:'./src/index.html',//指定输出得文件模板

filename:'index.html'//指定输出的文件名,最好使用index.html,这样运行的时候可以直接找到index.html

}),

new cssMiniExtractPlugin({

filename:'index.css'

})

],

module:{

rules:[

{

test:/\.css/,

// use:['style-loader','css-loader'] 使用cssMiniExtractPlugin插件将css抽出

use:[cssMiniExtractPlugin.loader,'css-loader']

},

{

test:/\.less/,

use:[cssMiniExtractPlugin.loader,'css-loader','less-loader']

}

]

}

mode改为production,打包的时候会把js压缩,css没有被压缩

css压缩插件 optimize-css-assets-webpack-plugin CssMinimizerWebpackPlugin

css-minimizer-webpack-plugin插件更新使用方法相同

使用:const OptCssAssetsWebpackPlugin =require('optimize-css-assets-webpack-plugin')

optimization:{

minimizer:[new OptCssAssetsWebpackPlugin()]

},

配置了css压缩后js压缩会失效,需要指定js压缩插件

terser-webpack-plugin

配置:

optimization:{

minimizer:[new OptCssAssetsWebpackPlugin(),new terserWebpackPlugin()]

},

webpack5支持部分es6,不支持es7

babel是一个javascript编译器

使用装载器 babel-loader

安装插件:npm install -D babel-loader @babel/core @babel/preset-env @babel/plugin-proposal-decorators --legacy-peer-deps

配置:{

test:/\.js$/,

use:{

loader:'babel-loader',

options:{

presets:[

"@babel/preset-env"

],

}

}

}

js模块化:

commonjs :

a.js

let c = 'a'

module.exports = {

c

}

加载:

let c = require('./a.js');

es6导出

a.js

const a = 444

export default a

加载

import a from './a.js'

tree shaking 树摇 在生产模式中启用

将没有使用的代码在打包中去掉(去掉不用的代码)

webpack4的这个功能很弱,只支持当前js中午用的代码删除

webpack5加强了这个功能

打包生成dist目录没有分类存储

打包生成动态名字和hash

filename:'css/[name].[hash].css'

filename:'css/[name].[hash:4].css' 4位hash值

第一次打包文件会被浏览器自动缓存,当第二次修改打包发布文件不变,文件不会下载新的文件

hash:内容hash,内容有改变hash值就会改变

全局变量 jquery

全局变量使用import导入就需要每个地方都需要导入

配置全局变量

const webpack = require('webpack')

webpack.providePlugin 能够给所有组件注入全局变量

new webpack.ProvidePlugin({

$:'jquery'

})

这样问题是会把jquery三方包一起打包,会造成打包的文件很大

将别的包使用cdn链接引入项目

externals:{

jquery:'$'

}

图片加载 file-loader

file-loader默认使用的是es6的模块化

{

test:/\.(jpg|png|webp)$/,

use:[{

loader:'file-loader',

options: {

esModule:false,//默认使用es6的模块化,false是commonjs模块化

name: '[name].[ext]',

outputPath: 'images/'

}

}],

},

1.使用js导入

2.css导入

{

test:/\.css$/,

// use:['style-loader','css-loader'] 使用cssMiniExtractPlugin插件将css抽出

use:[{

loader: cssMiniExtractPlugin.loader,

options: {

publicPath:'../'

}

},'css-loader']

},

3.html使用图片

插件 html-withimg-loader

配置: {

test:/\.html$/,

use:['html-withimg-loader']

},

url-loader使用方法和file-loader相同,只是url-loader可以设置limit属性在图片小于这个限制可以转化为base64

样式兼容性

chrome:webkit

等到所有厂商都支持后可以去掉前缀

安装插件: yarn add -D autoprefixer postcss-loader --legacy-peer-deps

使用创建配置文件:postcss.config.js

module.exports = {

plugins:[

require('autoprefixer')

]

}

在package.json中添加

"browserslist":[

"> 1%",

"last 100 version",

"not ie<=8"

]

配置postcss-loader

{

test:/\.css$/,

// use:['style-loader','css-loader'] 使用cssMiniExtractPlugin插件将css抽出

use:[{

loader: cssMiniExtractPlugin.loader,

options: {

publicPath:'../'

}

},'css-loader',,'postcss-loader']

},

单页面应用:页面都是动态生成,标签数据 单个html

多页面应用: 大型应用 静态化 多个html、

webpack多环境打包

各个环境服务器ip不同

.env 配置文件

模板模式:首先要有一个模板,这个模板会实现大部分功能,只留下部分未实现,子文件继承模板,自己扩展 最终得到一个子和父的合体

根究不同的环境配置

webpack.base.js 模板

webpack.dev.js 开发环境

webpack.prod.js 生产环境

多种跨域支持:

1.cors:后端处理

2.代理 nginx

3.webpack处理跨域

webpack代理 只能在开发中使用

devServer:{//w=配置webpack-dev-server

port:"8080",//配置端口

open:true,//自动打开浏览器

// progress:true,//显示进度

// contentBase:'./dist'//指定web服务器的根目录默认是dist

proxy:{

'/api':{

target:'http://...',

// pathRewrite:{

// '/api':''//去掉前缀/api

// }

}

}

},

4.将后端服务与前端服务整合到一块

const webpack = require('webpack');

const middle = require("webpack-dev-middleware");

const config = require('./webpack.config");

const compile = webpack(config);

app.use(middle(compile))

5.jsonp

热更新(热加载)

devServer:{//w=配置webpack-dev-server

port:"8080",//配置端口

open:true,//自动打开浏览器

hot:true,//开启热更新

// progress:true,//显示进度

// contentBase:'./dist'//指定web服务器的根目录默认是dist

proxy:{

'/api':{

target:'http://...',

// pathRewrite:{

// '/api':''//去掉前缀/api

// }

}

}

},

单页面应用配置

javascript 复制代码
const path = require('path');
let htmlWebpackPlugin = require('html-webpack-plugin');
const cssMiniExtractPlugin = require('mini-css-extract-plugin');
// const OptCssAssetsWebpackPlugin =require('optimize-css-assets-webpack-plugin')
const OptCssAssetsWebpackPlugin =require('css-minimizer-webpack-plugin')
const terserWebpackPlugin = require('terser-webpack-plugin')
const webpack = require('webpack')
// node写法,webpack基于node
module.exports = {
  mode:'production',//production、development
  // 入口
  entry:'./src/index.js',
  output:{
    path:path.resolve(__dirname,"dist"),
    filename:'js/[name].[hash].js'
  },
  devServer:{//w=配置webpack-dev-server
    port:"8080",//配置端口
    open:true,//自动打开浏览器
    // progress:true,//显示进度
    // contentBase:'./dist'//指定web服务器的根目录默认是dist
  },
  optimization:{
    minimizer:[new OptCssAssetsWebpackPlugin(),new terserWebpackPlugin()]
  },
  plugins:[
    new htmlWebpackPlugin({
      template:'./src/index.html',//指定输出得文件模板
      filename:'index.html'//指定输出的文件名,最好使用index.html,这样运行的时候可以直接找到index.html

    }),
    new cssMiniExtractPlugin({
      filename:'css/[name].[hash].css'
    }),
    new webpack.ProvidePlugin({
      $:'jquery'
    })
    
  ],
  module:{
    rules:[
      {
        test:/\.css$/,
        // use:['style-loader','css-loader'] 使用cssMiniExtractPlugin插件将css抽出
        use:[{
          loader: cssMiniExtractPlugin.loader,
          options: {
            publicPath:'../'
          }
        },'css-loader',,'postcss-loader']

      },
      {
        test:/\.less$/,
        use:[cssMiniExtractPlugin.loader,'css-loader','less-loader','postcss-loader']

      },
      // {
      //   test:/\.(jpg|png|webp)$/,
      //   use:[{
      //     loader:'file-loader',
      //     options: {
      //       esModule:false,//默认使用es6的模块化,false是commonjs模块化
      //       name: '[name].[ext]',
      //       outputPath: 'images/'
      //   }
      //   }],
      // },
      {
        test:/\.(jpg|png|webp)$/,
        use:[{
          loader:'url-loader',
          options: {
            esModule:false,//默认使用es6的模块化,false是commonjs模块化
            name: '[name].[ext]',
            outputPath: 'images/',
            limit:100*1024
        }
        }],
      },
      {
        test:/\.html$/,
        use:['html-withimg-loader']
      },
      {
        test:/\.js$/,
        use:{
          loader:'babel-loader',
          options:{
            presets:[
              "@babel/preset-env"
            ],
          }
        }

      }

    ]
  },
//排除不需要的第三方包
  externals:{
    jquery:'$'
  }

}

多页面应用:

javascript 复制代码
// 多页面应用打包需要指定多个入口多个出口
const path = require('path');
let htmlWebpackPlugin = require('html-webpack-plugin');
const cssMiniExtractPlugin = require('mini-css-extract-plugin');
// const OptCssAssetsWebpackPlugin =require('optimize-css-assets-webpack-plugin')
const OptCssAssetsWebpackPlugin =require('css-minimizer-webpack-plugin')
const terserWebpackPlugin = require('terser-webpack-plugin')
const webpack = require('webpack')
// node写法,webpack基于node
module.exports = {
  mode:'production',//production、development
  // 入口多页面应用
  entry:{
    index:'./src/index.js',
    other:'./src/other.js'

  },
  output:{
    path:path.resolve(__dirname,"dist"),
    filename:'js/[name].[hash].js'//多个入口就输出多个文件
  },
  devServer:{//w=配置webpack-dev-server
    port:"8080",//配置端口
    open:true,//自动打开浏览器
    hot:true,//开启热更新
    // progress:true,//显示进度
    // contentBase:'./dist'//指定web服务器的根目录默认是dist
    proxy:{
      '/api':{
        target:'http://...',
        // pathRewrite:{
        //   '/api':''//去掉前缀/api
        // }
      }
    }
  },
  optimization:{
    minimizer:[new OptCssAssetsWebpackPlugin(),new terserWebpackPlugin()]
  },
  plugins:[
    // 输出主页 引入的js也不一样
    new htmlWebpackPlugin({
      template:'./src/index.html',//指定输出得文件模板
      filename:'index.html',//指定输出的文件名,最好使用index.html,这样运行的时候可以直接找到index.html
      chunks:['index']
    }),
    // 输出别的页面
    new htmlWebpackPlugin({
      template:'./src/index.html',//指定输出得文件模板
      filename:'other.html',//指定输出的文件名,最好使用index.html,这样运行的时候可以直接找到index.html
      chunks:['index','other']
    }),
    new cssMiniExtractPlugin({
      filename:'css/[name].[hash].css'
    }),
    new webpack.ProvidePlugin({
      $:'jquery'
    })
    
  ],
  module:{
    rules:[
      {
        test:/\.css$/,
        // use:['style-loader','css-loader'] 使用cssMiniExtractPlugin插件将css抽出
        use:[{
          loader: cssMiniExtractPlugin.loader,
          options: {
            publicPath:'../'
          }
        },'css-loader',,'postcss-loader']

      },
      {
        test:/\.less$/,
        use:[cssMiniExtractPlugin.loader,'css-loader','less-loader','postcss-loader']

      },
      // {
      //   test:/\.(jpg|png|webp)$/,
      //   use:[{
      //     loader:'file-loader',
      //     options: {
      //       esModule:false,//默认使用es6的模块化,false是commonjs模块化
      //       name: '[name].[ext]',
      //       outputPath: 'images/'
      //   }
      //   }],
      // },
      {
        test:/\.(jpg|png|webp)$/,
        use:[{
          loader:'url-loader',
          options: {
            esModule:false,//默认使用es6的模块化,false是commonjs模块化
            name: '[name].[ext]',
            outputPath: 'images/',
            limit:100*1024
        }
        }],
      },
      {
        test:/\.html$/,
        use:['html-withimg-loader']
      },
      {
        test:/\.js$/,
        use:{
          loader:'babel-loader',
          options:{
            presets:[
              "@babel/preset-env"
            ],
          }
        }

      }

    ]
  },
//排除不需要的第三方包
  externals:{
    jquery:'$'
  }

}
相关推荐
腾讯TNTWeb前端团队5 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰9 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪9 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪9 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy10 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom10 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom10 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom10 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom11 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom11 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试