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:'$'
  }

}
相关推荐
阿珊和她的猫2 小时前
v-scale-scree: 根据屏幕尺寸缩放内容
开发语言·前端·javascript
_Kayo_4 小时前
node.js 学习笔记3 HTTP
笔记·学习
加班是不可能的,除非双倍日工资6 小时前
css预编译器实现星空背景图
前端·css·vue3
wyiyiyi7 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
CCCC13101637 小时前
嵌入式学习(day 28)线程
jvm·学习
gnip7 小时前
vite和webpack打包结构控制
前端·javascript
excel8 小时前
在二维 Canvas 中模拟三角形绕 X、Y 轴旋转
前端
星星火柴9368 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
小狗爱吃黄桃罐头8 小时前
正点原子【第四期】Linux之驱动开发篇学习笔记-1.1 Linux驱动开发与裸机开发的区别
linux·驱动开发·学习
阿华的代码王国8 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端