• webpack 之 打包(最新版)


    非常容易忘记的问题点 

    npm i less-loader 时,一定不要忘记less

    npm i less-loader@7.2.1 -D ,这里一定要是低版本,因为为8.0.0会报错

     

    一. webpack 能做什么?

    webpack是一个 静态模块打包器

    1.语法转换

       .less/sass 转换 css

        ES6 转换 ES5

    2.html/css/js 代码压缩合并(打包)

    3.webpack可以在开发期间提供一个开发服务器

    项目一般打包再上线

    二.webpack打包演示

    1.建目录 dist src/main.js

    2.初始化

    npm i yarn -g //先安装yarn包
    yarn init -y

    3.安装依赖包

      dependencies 项目依赖, 实际上线, 也要用的包, 比如 jquery yarn add jquery

      devDependencies 开发依赖, 实际上线, 不用这个包, 只在开发打包过程中用 -D

    yarn add webpack  webpack-cli  -D

    注意:webpack-cli 使用 webpack 4+版本需要安装

    4.创建文件

    index.js文件

    console.log("我要打包了");

    package.json文件

    {
      "devDependencies": {
        "webpack": "^5.23.0",
        "webpack-cli": "^4.5.0"
      },
      "name": "day06",
      "version": "1.0.0",
      "main": "index.js",
      "license": "MIT",
      "scripts":{
        "build":"webpack ./src/index.js"
      }
    }

    注意:此处运行脚本 yarn build  生成成功.这时候就会生成dist文件夹和main.js(默认的)

    4.配置文件修改

    scripts: {
        "build": "webpack --config webpack.config.js"
    }
    --config webpack.config.js实际是默认的,可以不写,但若是执行别的配置文件,那么就需要对应的配置文件了

    (1)新增配置文件webpack.config.js

    let path = require("path");
    module.exports = {
      //入口
      entry: path.join(__dirname, "./src/index.js"),
      //环境
      mode: "development",
    };

    注意:此时,删除文件dist,同时执行yarn build生成成功

    (2)指定打包出口 配置webpack.config.js

    let path = require("path");
    module.exports = {
      //入口
      entry: path.join(__dirname, "./src/index.js"),
    //出口
    output:{
      path:path.join(__dirname,'./dist'),
    filename:'bundle.js'
    } //环境 mode: "development",
    };  

    注意:此时执行 yarn build 生成成功,会出现dist 文件 bundle.js文件

    5.通过隔行变色案例 了解  ES6的import 作用

    思维:在webconfig.config.js文件中可以使用 require,不能使用import

            在index.js中可以使用import 也可以使用 require,但实际引用的是打包后的bundle.js

    注意:这一阶段,只是通过普通的引用js文件来展示index.html

    (1)npm i query 

    (2)在src添加index.html文件

    (3)文件内容

    index.html

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
      </head>
      <body>
        <ul>
          <li>我是li1</li>
          <li>我是li2</li>
          <li>我是li3</li>
          <li>我是li4</li>
          <li>我是li5</li>
          <li>我是li6</li>
        </ul>
        <script src="../node_modules/jquery/dist/jquery.js"></script> 
        <script src="./index.js"></script>
      </body>
    </html>

    index.js文件

    console.log("我要打包了");
    
    $("li:odd").css("background", "red");
    $("li:even").css("background", "blue");

    重点:此时希望通过 es6的import 加载jquery 模块怎么弄?

    (1)将index.html 中的下面内容去掉

    <script src="../node_modules/jquery/dist/jquery.js"></script>  //去掉

    (2)修改index.js内容

    console.log("我要打包了");
    import $ from "jquery";
    
    $("li:odd").css("background", "red"); //
    $("li:even").css("background", "blue");

    (3)执行执行命令

    yarn build

    结果:生成不报错,bundle.js内容中会出现jquery的内容,但是实际在ctrl+b时,页面不会出现效果,会报错,提示Cannot use import statement outside a module

    分析:因为这是浏览器环境,而即使在package.json中添加type:module没效果,因为那是因为在node中执行的,同理,那么在上面index.js中使用index.js也是无效的

    思考:在index.html中一直引用的是index.js,但是index.js中使用ex6的import,是无效的,那么此时,就需要想到打包,打包后的bundle.js是支持es6module语法的

    (3在index.html中将index.js的引入修改为bundle.js的引入

    <script src="../dist/bundle.js"></script>

    执行命令 yarn build 生成成功,并且可以出现效果

    6.打包html文件

    (1)安装npm i html-webpack-plugin -D

    (2)配置webconfig.config.js文件

    let path = require("path");
    const htmlWebpackPlugin = require("html-webpack-plugin"); //需要new一个插件对象
    module.exports = {
      //入口
      entry: path.join(__dirname, "./src/index.js"),
      //出口
      output: {
        path: path.join(__dirname, "./dist"),
        filename: "bundle.js",
      },
      //环境
      mode: "development",
      //插件
      plugins: [ 
        new htmlWebpackPlugin({
          template: path.join(__dirname, "./src/index.html"),
        }),
      ],
    };

    作用:打包index.html后,可以不用手动去添加引入,因为会在打包的时候自动引入

    7.打包css文件

    注意:webpack是无法打包css图片模块的,这时需要用到loader来解决

    (1)安装包 npm i style-loader css-loader 

    (2)index.js引入index.css文件 

    import "./css/index.css";

    (3)配置webpack.config.js

    let path = require("path");
    const htmlWebpackPlugin = require("html-webpack-plugin");
    module.exports = {
      //入口
      entry: path.join(__dirname, "./src/index.js"),
      //出口
      output: {
        path: path.join(__dirname, "./dist"),
        filename: "bundle.js",
      },
      //环境
      mode: "development",
      //插件
      plugins: [
        new htmlWebpackPlugin({
          template: path.join(__dirname, "./src/index.html"),
        }),
      ],
      module: {
        rules: [
          {
            // 正则表达式,用于匹配所有的css文件
            test: /.css$/,
            // 先用 css-loader 让webpack能够识别 css 文件的内容
            // 再用 style-loader 将样式, 以动态创建style标签的方式添加到页面中去
            use: ["style-loader", "css-loader"],
          },
        ],
      },
    };

    强调:webpack.config.js配置module部分特别重要,不配置,那么就会生成报错

        

    8.打包less文件

    (1)安装 yarn add less  less-loader  -D    //分析: less-loader是依赖于less包的

    (2)index.js导入kk.less文件

    import "./css/kk.less";

    kk.less文件内容

    li {
      text-align: center;
    }

    (3)配置webpack.config.js文件

    let path = require("path");
    const htmlWebpackPlugin = require("html-webpack-plugin");
    module.exports = {
      //入口
      entry: path.join(__dirname, "./src/index.js"),
      //出口
      output: {
        path: path.join(__dirname, "./dist"),
        filename: "bundle.js",
      },
      //环境
      mode: "development",
      //插件
      plugins: [
        new htmlWebpackPlugin({
          template: path.join(__dirname, "./src/index.html"),
        }),
      ],
      module: {
        rules: [
          {
            // 正则表达式,用于匹配所有的css文件
            test: /.css$/,
            // 先用 css-loader 让webpack能够识别 css 文件的内容
            // 再用 style-loader 将样式, 以动态创建style标签的方式添加到页面中去
            use: ["style-loader", "css-loader"],
          },
          {
            test: /.less$/,
            use: ["style-loader", "css-loader", "less-loader"],
          },
        ],
      },
    };

    9.打包图片文件

    (1)添加src/images文件夹,添加图片

    (2)安装包:npm url-loader  file-loader -D

    (3)修改index.css文件内容

    body {
      background: url("../images/kk.jpg");
    }

    (4)配置webpack.config.js

    简单配置,若是图片文件比较大,就会在dist中生成一个重新命名的图片

    特别注意:当文件大于10kb时,是需要file-loader包存在的

     {
        test: /.(png|svg|jpg|gif)$/,
        use: ["url-loader"],
     }

    复杂配置,只要设置的limit的大小大于图片大小,或者找很小的图片,那么就会以64编码的格式显示图片,这样就不会在dist生成新的图片

        {
            test: /.(png|jpg|gif|jpeg)$/,
            use: [
              {
                loader: "url-loader",
                options: {
                  limit: 50000,
                },
              },
            ],
          },
    

      

    10.处在开发阶段 通过webpack-dev-server提供一个服务器环境

    (1)为什么要使用这个包?

    因为这个包能够为使用webpack打包提供一个服务器环境

    (2)有哪些作用?

    . 自动为项目提供一个服务器

    .自动打开浏览器

    .自动监视文件变化,自动刷新浏览器

    (3) 安装 npm i webpack-dev-server -D

    (4)配置package.json,添加下面内容

    "scripts": {
        "build": "webpack --config webpack.config.js",
        "dev":" webpack serve --config webpack.config.js"
    }

    (5)执行命令npm run dev 后,通过这个路径打开,这样只要修改html,css等文件,都可以时时生效,会自动刷新页面

    (6)配置webpack.config.js

    devServer: {
      port: 3000, // 端口号
      open: true // 自动打开浏览器
    }

    11.热更新

    (1)作用:比如修改页面的字体颜色,此时不需要浏览器刷新,所有就有热更新

    (2)修改pageage.json文件

      "scripts": {
        "build": "webpack --config webpack.config.js",
        "dev":" webpack serve --config webpack.config.js hot"
      }

    12.dev 和build 的使用区别(指的是pageage.json的script中的dev和build)

    {
      "devDependencies": {
        "css-loader": "^5.0.2",
        "file-loader": "^6.2.0",
        "html-webpack-plugin": "^5.2.0",
        "less": "^4.1.1",
        "less-loader": "^8.0.0",
        "style-loader": "^2.0.0",
        "url-loader": "^4.1.1",
        "webpack": "^5.23.0",
        "webpack-cli": "^4.5.0",
        "webpack-dev-server": "^3.11.2"
      },
      "name": "day06",
      "version": "1.0.0",
      "main": "index.js",
      "license": "MIT",
      "scripts": {
        "build": "webpack --config webpack.config.js",
        "dev":" webpack serve --config webpack.config.js"
      },
      "dependencies": {
        "jquery": "^3.5.1"
      }
    }

    在开发阶段:就运行 yarn dev   本地开启一个服务器=>本地是没有实体包的(99%)

    在发布阶段:就运行 yarn build 打包文件  =>打包(实体包) (1%)

    13.babel处理ES6语法,可以转化为低版本的语法

    (1)安装包: yarn add babel-loader @babel/core @babel/preset-env -D

     babel-loader  处理js

    @babel/core  核心包

    @babel/preset-env  处理es6789...

    (2)配置webpack.config.js

    {
       test: /.js$/,
       exclude: /node_modules/,
       use: {
          loader: "babel-loader",
          options: {
             presets: ["@babel/preset-env"],
          },
       },
    }

    或者是创建.babelrc文件

    {
      "presets":["env"]
    }
  • 相关阅读:
    算法与数据结构(1):基础部分——以插入排序为例
    软件工程结对作业
    软件工程第1次作业
    软件工程第0次作业
    python爬虫随笔(2)—启动爬虫与xpath
    python爬虫随笔-scrapy框架(1)——scrapy框架的安装和结构介绍
    【面试题】String类、包装类的不可变性
    【面试题】Java类初始化和实例初始化的顺序
    【面试题】Java单例设计模式-饿汉式枚举(enum)单例
    【面试题】从JVM的角度去理解i++和++i
  • 原文地址:https://www.cnblogs.com/zmztya/p/14430590.html
Copyright © 2020-2023  润新知