自动化构建工具——4.webpack打包各类资源

webpack各类资源的打包

将所需要的包下载到根目录,这样在子目录用的时候会自动向上一级找包

一、创建配置文件

项目和配置是两方面,项目的代码用的是ES6模块;而配置模块是基于node.js平台运行的默认采用commonjs。

  • 创建文件 webpack.config.js

  • 基本配置内容如下

/**
 * webpack.config.js  webpack的配置文件
 *  作用:指示webpack干哪些活(当你运行webpack指令时,会加载里面的配置)
 * 
 *  所有构建工具都是基于node.js平台运行的,模块化默认采用commonjs。
 */

//  resolve用来拼接绝对路径的方法
const { resolve } = require('path')

module.exports = {
  //  webpack的配置
  // 入口起点
  entry: './src/index.js',
  // 输出
  output: {
    // 输出文件名
    filename: 'built.js',
    // 输出路径
    // __dirname  node.js的变量,当前文件的目录绝对路径
    path: resolve(__dirname, 'build')
  },
  // loader的配置
  module: {
    rules: [
      // 详细的loader配置
    ]
  },
  // plugins的配置
  plugins: [
    // 详细的plugins配置
  ],
  // 模式
  mode: 'development',    // 以开发模式测试
  // mode: 'production'
}
  • 运行指令: webpack

  • 结论: 此时功能与上节一致

二、打包样式资源

  • 需要配置的部分:loader
  • loader包的使用步骤:
    • 下载
    • 使用(配置loader部分)

2.1 目录结构

|-- 03.打包样式资源   项目根目录
|---- src	           项目源代码目录
|------ index.js       webpacke入口起点文件
|------ index.css  
|------ index.less
|---- build
|-- webpack.config.js  配置文件
  • index.css
html,
body {
  margin: 0;
  padding: 0;
  height: 100%;
  background-color: pink;
}
  • index.less
#title {
  color: red;
}
  • index.js
// 引入样式资源
import './index.css'
import './index.less'

2.2 下载loader包

npm install css-loader style-loader less-loader less -D

2.3 修改配置文件

module部分

// loader的配置
  module: {
    rules: [
      // 详细的loader配置
      // 不同的文件必须配置不同的loader处理
      {
        // 匹配哪些文件
        test: /\.css$/, // 以.css结尾的文件
        // 使用哪些loader进行处理
        use: [
          // use数组中loader执行顺序:从右到左,从下到上依次执行
          // 创建style标签,将js中的样式资源插入进去,再添加到head中生效
          'style-loader',
          // 将css文件变成commonjs模块加载到js中,里面内容是样式字符串
          'css-loader'
        ]
      },
      {
        // 匹配哪些文件
        test: /\.less$/, 
        use: [
          'style-loader',
          'css-loader',
          // 将less文件编译成css文件
          // 需要下载less-loader和less
          'less-loader'
        ]
      }
    ]
  },

2.4 运行webpack指令

在这里插入图片描述

2.5 在html页面中引入打包好的js文件

./build/index.html

<body>
  <h1 id="title">hello less</h1>
  <script src="./built.js"></script>
</body>

在这里插入图片描述

三、打包html资源

  • 需要配置的地方:plugins部分

  • plugin使用步骤:

    • 下载html -webpack -plugin

    • 引入:

      • const HtmlWebpackPlugin = require('html-webpack-plugin')
        
    • 使用:

      • new HtmlWebpackPlugin()
        

3.1 目录结构

在这里插入图片描述

3.2 下载安装plugin包

  • 输入指令(在根目录):npm i html-webpack-plugin -D

  • html -webpack -plugin包功能:默认会创建一个空的HTML,自动引入打包输出的所有资源(JS/CSS)

3.3 修改配置文件

/**
 * loader:1.下载 2.使用(配置loader)
 * plugins:1.下载   2.引入   3.使用
 */

const { resolve } = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'built.js',
    path: resolve(__dirname, 'build')
  },
  module: {
    rules: [
      // loader的配置
    ]
  },
  plugins: [
    // plugins配置
    // html -webpack -plugin
    // 功能:默认会创建一个空的HTML,自动引入打包输出的所有资源(JS/CSS)
    // 需求:需要有结构的HTML文件
    new HtmlWebpackPlugin({
      // 复制'./src/index.html'文件,并自动引入打包输出的所有资源(JS/CSS)
      template: './src/index.html'
    })
  ],
  mode:'development'
}

3.4 运行webpack指令

在这里插入图片描述

可以在./build目录下看到左右打包好的文件=
在这里插入图片描述
浏览器运行./build/index.html
在这里插入图片描述

四、打包图片资源

  • 需要配置的地方:module部分
  • 需要的loader包:
    • url-loader:处理图片资源,但默认处理不了html中的img图片
    • file-loader:url-loader所需
    • html-loader:处理html文件中的img图片(负责引入img,从而能被url-loader进行处理)

使用url-loader包时存在的问题:因为url-loader默认使用ES6模块化解析,而html-loader引入图片是commonjs解析时会出问题

解决:关闭url-loader的ES6模块化,使用commonjs解析

4.1 目录结构

在这里插入图片描述
index.html

<body>
  <div id="box1"></div>
  <div id="box2"></div>
  <div id="box3"></div>
</body>

index.less

#box1 {
  width: 100px;
  height: 100px;
  background-image: url('./1.png');
  background-repeat: no-repeat;
  background-size: 100% 100%;
}
 
#box2 {
  width: 200px;
  height: 300px;
  background-image: url('./2.jpg');
  background-repeat: no-repeat;
  background-size: 100% 100%;
}

#box3 {
  width: 300px;
  height: 400px;
  background-image: url('./3.jpg');
  background-repeat: no-repeat;
  background-size: 100% 100%;
}

index.js

import './index.less'

4.2 下载安装 loader 包

  • 输入指令(在根目录):npm i url-loader file-loader html-loader -D

4.3 修改配置文件

const { resolve } = require('path')

const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'built.js',
    path: resolve(__dirname, 'build')
  },
  module: {
    rules: [
      // loader的配置
      {
        test: /\.less$/,
        use: [
          'style-loader',
          'css-loader',
          'less-loader'
        ]
      },
      {
        // 问题:默认处理不了html中的img图片
        // 处理图片资源
        test: /\.(jpg|png|gif)$/,
        // 使用一个loader
        // 下载 url-loader file-loader
        loader: 'url-loader',
        options: {
          // 图片大小小于10kb,就会被base64处理(8~12kb)
          // 优点:减少请求数量(减轻服务器压力)
          // 缺点:图片体积会更大(文件请求速度更慢)
          limit: 10 * 1024,

          /**
           * 问题:因为url-loader默认使用ES6模块化解析,而html-loader引入图片是commonjs
           * 解析时会出问题:[object Module]
           * 解决:关闭url-loader的ES6模块化,使用commonjs解析
           */
          esModule: false,
          // 给图片重命名
          // [hash: 10]取图片的hash的前10位
          // [ext]取文件原来扩展名
          name: '[hash:10].[ext]'
        }
      },
      {
        test: /\.html$/,
        // 处理html文件中的img图片(负责引入img,从而能被url-loader进行处理)
        loader: 'html-loader'
      }
    ]
  },
  plugins: [
    // plugins配置
    // html -webpack -plugin
    // 功能:默认会创建一个空的HTML,自动引入打包输出的所有资源(JS/CSS)
    // 需求:需要有结构的HTML文件
    new HtmlWebpackPlugin({
      // 复制'./src/index.html'文件,并自动引入打包输出的所有资源(JS/CSS)
      template: './src/index.html'
    })
  ],
  mode: 'development'
}

4.4 运行webpack指令

在这里插入图片描述

可以在./build目录下看到左右打包好的文件
在这里插入图片描述

浏览器运行./build/index.html
在这里插入图片描述

五、打包其他资源

不需要进行任何处理,只需原封不动的输出出去的资源统一称为其他资源。

  • 需要的loader包:file-loader(之前已经安装过)

5.1 目录结构

在这里插入图片描述

5.2 修改配置文件

const { resolve } = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'built.js',
    path: resolve(__dirname, 'build')
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader']
      },
      // 打包其他资源(除了html/js/css/less资源以外的资源)
      {
        // 排除css/js/html/less资源
        exclude: /\.(css|js|html|less)$/,
        loader: 'file-loader',
        options: {
          name: '[hash:10].[ext]'
        }
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html'
    })
  ],
  mode: 'development'
}

5.3 运行webpack指令

在这里插入图片描述

可以在./build目录下看到左右打包好的文件
在这里插入图片描述

浏览器运行./build/index.html
在这里插入图片描述

六、devserver——自动编译

  • 概念:每修改一次项目代码就要重复执行一次webpack打包操作,为了减少这种麻烦的操作,提出了开发服务器——devserver,用来自动化(自动编译、自动打开浏览器、自动刷新浏览器)

  • 特点:只会在内存中编译打包,不会有任何输出

  • 需要下载的包:

    npm i webpack-dev-server -D
    
  • 启动devserver指令为:

    npx webpack-dev-server
    

6.1 目录结构

在上以内容的目录结构基础上修改、配置

index.js

// 引入iconfont样式资源
import './iconfont.css'

function add(x, y) {
  return x + y
}

console.log(add(2, 3))

index.html

<body>
  <span class="iconfont icon-icon-test"></span>
  <span class="iconfont icon-icon-test1"></span>
  <span class="iconfont icon-icon-test2"></span>
  <span class="iconfont icon-icon-test3"></span>

  <div>hello webpack</div>
</body>

6.2 下载安装devserver包

npm i webpack-dev-server -D

在这里插入图片描述

6.3 修改配置文件

const { resolve } = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'built.js',
    path: resolve(__dirname, 'build')
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader']
      },
      // 打包其他资源(除了html/js/css/less资源以外的资源)
      {
        // 排除css/js/html/less资源
        exclude: /\.(css|js|html|less)$/,
        loader: 'file-loader',
        options: {
          name: '[hash:10].[ext]'
        }
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html'
    })
  ],
  mode: 'development',

  // 开发服务器 devserver:用来自动化(自动编译、自动打开浏览器、自动刷新浏览器)
  // 特点:只会在内存中编译打包,不会有任何输出
  // 启动devserver指令为:npx webpack-dev-server
  devServer: {
    // 项目构建后路径
    contentBase:resolve(__dirname, 'build'),
    // 启动gzip压缩
    compress: true,
    // 端口号
    port: 3000,
    // 自动打开浏览器
    open: true 
  }
}

6.4 启动devserver指令

在这里插入图片描述

运行./build/index.html
在这里插入图片描述

修改项目代码并保存后,会自动将最新的内容打包

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值