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

}
相关推荐
高山我梦口香糖14 分钟前
[react]searchParams转普通对象
开发语言·前端·javascript
sanguine__15 分钟前
Web APIs学习 (操作DOM BOM)
学习
m0_7482352417 分钟前
前端实现获取后端返回的文件流并下载
前端·状态模式
m0_748240251 小时前
前端如何检测用户登录状态是否过期
前端
black^sugar1 小时前
纯前端实现更新检测
开发语言·前端·javascript
寻找沙漠的人2 小时前
前端知识补充—CSS
前端·css
GISer_Jing2 小时前
2025前端面试热门题目——计算机网络篇
前端·计算机网络·面试
m0_748245522 小时前
吉利前端、AI面试
前端·面试·职场和发展
理想不理想v2 小时前
webpack最基础的配置
前端·webpack·node.js
pubuzhixing2 小时前
开源白板新方案:Plait 同时支持 Angular 和 React 啦!
前端·开源·github