webpack学习第一篇

139 阅读3分钟

前言

没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。

webpack

理解 webpack

  • 入口 -出口 -装饰器 loader -插件 plugin

创建 webpack 工程

1.生成 package.json npm init -y 2.安装 webpack npm -i webpack webpack-cli npm i -D webpack webpack-cli node 自带 npm npx -S 保存的包是需要发布的 -D 是不需要发布的

webpack 零配置

默认入口 src/index.js 默认出口 dist/main.js npx webpack 只打包 js. 生成 main.js

指定 webpack 配置

let path = require("path");
let HtmlWebpackPlugin = require("html-webpack-plugin");

module.exports = {
  //入口 出口 loader plugin
  entry: "./src/index.js",
  //指定打包的环境,开发模式
  mode: "development", //production 生产模式

  output: {
    //__dirname 表示当前目录
    path: path.resolve(__dirname, "dist"), //绝对路径
    filename: "index.js", //输出的文件名
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: "./src/index.html", //指定输出的文件模板
      filename: "main.html", //指定输出dist 文件名改名字
    }),
  ],
};

webpack-dev-server

```js
 npm i -D webpack-dev-server
 //package.json
 scripts: {
dev: "webpack serve",
build:"webpack"
  },

let path=require('path')

let HtmlWebpackPlugin=require("html-webpack-plugin")

module.exports={ //入口 出口 loader plugin entry:"./src/index.js", //指定打包的环境,开发模式 mode:'development',//production 生产模式

output:{
    //__dirname 表示当前目录
    path:path.resolve(__dirname,"dist"),//绝对路径
    filename:"index.js"                 //输出的文件名
},
// devServer:{//配置webpack-dev-server
//    port:8083,//配置web服务器端口
//    open:true,//自动打开浏览器
//    progress:true, //进度
//    //contentBase:'./dist' //指定web服务器的根目录


// },
plugins:[
     new HtmlWebpackPlugin({
         template:'./src/index.html',//指定输出的文件模板
         filename:'index.html'//指定输出dist 文件名改名字
     })
]

}

 # 打报css

 ```js
 webpack默认只加载js,不支持加载css
 需要css 装载器 css-loader
 npm i -D css-loader
 style-loader 把cssz直接添加到HTML的style标签里面
 npm i -D style-loader

装载器执行顺序

 先加载 css 后整合到html的<style>
从右到左
  // a.css 文件
   #test{
   color: brown;
}
//index.css 文件
 @import './a.css';

body {
   background-color: blueviolet;
}
// index.js文件
import('./index.css')

//webpack.config.js 文件

let path=require('path')
let HtmlWebpackPlugin=require("html-webpack-plugin")

module.exports={
   //入口 出口 loader plugin
   entry:"./src/index.js",
   //指定打包的环境,开发模式
  mode:'development',//production 生产模式
  
   output:{
       //__dirname 表示当前目录
       path:path.resolve(__dirname,"dist"),//绝对路径
       filename:"index.js"                 //输出的文件名
   },
   // devServer:{//配置webpack-dev-server
   //    port:8083,//配置web服务器端口
   //    open:true,//自动打开浏览器
   //    progress:true, //进度
   //    //contentBase:'./dist' //指定web服务器的根目录


   // },
   module:{
       rules:[
           {
               test:/\.css$/,
               use:['style-loader','css-loader']
           }
       ]
   },
   plugins:[
        new HtmlWebpackPlugin({
            template:'./src/index.html',//指定输出的文件模板
            filename:'index.html'//指定输出dist 文件名改名字
        }),
        new HtmlWebpackPlugin({
           template:'./src/index.html',//指定输出的文件模板
           filename:'main.html'//指定输出dist 文件名改名字
       })
   ]
   
}

less

npm i -D less less-loader
//webpack.config.js 文件
let path=require('path')
let HtmlWebpackPlugin=require("html-webpack-plugin")

module.exports={
   //入口 出口 loader plugin
   entry:"./src/index.js",
   //指定打包的环境,开发模式
  mode:'development',//production 生产模式
  
   output:{
       //__dirname 表示当前目录
       path:path.resolve(__dirname,"dist"),//绝对路径
       filename:"index.js"                 //输出的文件名
   },
   // devServer:{//配置webpack-dev-server
   //    port:8083,//配置web服务器端口
   //    open:true,//自动打开浏览器
   //    progress:true, //进度
   //    //contentBase:'./dist' //指定web服务器的根目录


   // },
   module:{
       rules:[
           {
               test:/\.css$/,
               use:['style-loader','css-loader']
           },
           {
               test:/\.less$/,
               use:['style-loader','css-loader','less-loader']
           }
       ]
   },
   plugins:[
        new HtmlWebpackPlugin({
            template:'./src/index.html',//指定输出的文件模板
            filename:'index.html'//指定输出dist 文件名改名字
        }),
        new HtmlWebpackPlugin({
           template:'./src/index.html',//指定输出的文件模板
           filename:'main.html'//指定输出dist 文件名改名字
       })
   ]
   
}

抽取CSS作为单独的文件

-便于css压缩合并 缓存

  npm i -D mini-css-extract-plugin
//webpack.config.js

  let path=require('path')
let HtmlWebpackPlugin=require("html-webpack-plugin")
let MiniCssExtractPlugin=require("mini-css-extract-plugin")

module.exports={
   //入口 出口 loader plugin
   entry:"./src/index.js",
   //指定打包的环境,开发模式
  mode:'development',//production 生产模式
  
   output:{
       //__dirname 表示当前目录
       path:path.resolve(__dirname,"dist"),//绝对路径
       filename:"index.js"                 //输出的文件名
   },
   // devServer:{//配置webpack-dev-server
   //    port:8083,//配置web服务器端口
   //    open:true,//自动打开浏览器
   //    progress:true, //进度
   //    //contentBase:'./dist' //指定web服务器的根目录


   // },
   module:{
       rules:[
           {
               test:/\.css$/,
              // use:['style-loader','css-loader']
              use:[MiniCssExtractPlugin.loader,'css-loader']
           },
           {
               test:/\.less$/,
               //use:['style-loader','css-loader','less-loader']
               use:[MiniCssExtractPlugin.loader,'css-loader','less-loader']
           }
       ]
   },
   plugins:[
        new HtmlWebpackPlugin({
            template:'./src/index.html',//指定输出的文件模板
            filename:'index.html'//指定输出dist 文件名改名字
        }),
       new MiniCssExtractPlugin({
           filename:'index.css'
       })
   ]
   
}

css 压缩

css压缩插件: npm i -D optimize-css-assets-webpack-plugin
    css-minimizer-webpack-plugin
 在指定css压缩后,js压缩就无效了.需要再次指定js压缩
js压缩插件: npm i -D terser-webpack-plugin

 let path=require('path')
let HtmlWebpackPlugin=require("html-webpack-plugin")
let MiniCssExtractPlugin=require("mini-css-extract-plugin")
let TerserPlugin=require('terser-webpack-plugin')
let OptimizeCssPlugin=require('optimize-css-assets-webpack-plugin')

module.exports={
  //配置css压缩的插件
  optimization:{
      minimizer:[newTerserPlugin(), new OptimizeCssPlugin()]
  },
  //入口 出口 loader plugin
  entry:"./src/index.js",
  //指定打包的环境,开发模式
 mode:'production',//production 生产模式
 
  output:{
      //__dirname 表示当前目录
      path:path.resolve(__dirname,"dist"),//绝对路径
      filename:"index.js"                 //输出的文件名
  },
  // devServer:{//配置webpack-dev-server
  //    port:8083,//配置web服务器端口
  //    open:true,//自动打开浏览器
  //    progress:true, //进度
  //    //contentBase:'./dist' //指定web服务器的根目录


  // },
  module:{
      rules:[
          {
              test:/\.css$/,
             // use:['style-loader','css-loader']
             use:[MiniCssExtractPlugin.loader,'css-loader']
          },
          {
              test:/\.less$/,
              //use:['style-loader','css-loader','less-loader']
              use:[MiniCssExtractPlugin.loader,'css-loader','less-loader']
          }
      ]
  },
  plugins:[
       new HtmlWebpackPlugin({
           template:'./src/index.html',//指定输出的文件模板
           filename:'index.html'//指定输出dist 文件名改名字
       }),
      new MiniCssExtractPlugin({
          filename:'index.css'
      })
  ]
  
}

es6 es7支持

npm i -D babel-loader

npm i -D babel-loader @babel/core @babel/preset-env @babel/plugin-proposal-decorators

//webpack.config.js
  let path=require('path')
let HtmlWebpackPlugin=require("html-webpack-plugin")
let MiniCssExtractPlugin=require("mini-css-extract-plugin")
let TerserPlugin=require('terser-webpack-plugin')
// let OptimizeCssPlugin=require('optimize-css-assets-webpack-plugin')
let CssPlugin=require('css-minimizer-webpack-plugin')


module.exports={
    //配置css压缩的插件
    optimization:{
        minimizer:[new TerserPlugin(), new CssPlugin()]
    },
    //入口 出口 loader plugin
    entry:"./src/index.js",
    //指定打包的环境,开发模式
   mode:'production',//production 生产模式
   
    output:{
        //__dirname 表示当前目录
        path:path.resolve(__dirname,"dist"),//绝对路径
        filename:"index.js"                 //输出的文件名
    },
    // devServer:{//配置webpack-dev-server
    //    port:8083,//配置web服务器端口
    //    open:true,//自动打开浏览器
    //    progress:true, //进度
    //    //contentBase:'./dist' //指定web服务器的根目录


    // },
    module:{
        rules:[
            //转es6 es7
            {
              test:/\.js$/,
              use:{
                  loader:'babel-loader',
                  options:{
                      presets:[
                          "@babel/preset-env"
                      ],
                      "plugins":[
                          ["@babel/plugin-proposal-decorators",{"legacy":true}],
                          ["@babel/plugin-proposal-class-properties",{"loose":true}]
                      ]
                  }
              }
            },
            {
                test:/\.css$/,
               // use:['style-loader','css-loader']
               use:[MiniCssExtractPlugin.loader,'css-loader']
            },
            {
                test:/\.less$/,
                //use:['style-loader','css-loader','less-loader']
                use:[MiniCssExtractPlugin.loader,'css-loader','less-loader']
            }
        ]
    },
    plugins:[
         new HtmlWebpackPlugin({
             template:'./src/index.html',//指定输出的文件模板
             filename:'index.html'//指定输出dist 文件名改名字
         }),
        new MiniCssExtractPlugin({
            filename:'index.css'
        })
    ]
    
}

js 模块化 支持

 common.js:
 导出:module.exports 导入:require
 es6:
 导出:export default ,export xxx  导入:import xx form xxx

tree shaking(去掉无用的代码)

  webpack4有这个功能,很弱,只支持当前JS 中无用的代码
 webpack5加强了这个功能,
 会检查整个链路中属性的使用情况,确定没有使用就去掉
 只会在生产模式下才会摇树