美文网首页
webpack系列文章之入门篇

webpack系列文章之入门篇

作者: 孙静静 | 来源:发表于2020-08-03 19:49 被阅读0次

Webpack 是一个前端资源加载/打包工具。它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源。


图片引用webpack菜鸟教程

安装

新建文件夹后

  1. npm init 初始化
  2. npm install webpack webpack-cli -d 安装 webpack 和 weback-cli
  3. 创建src文件夹
  4. 创建在命令行中默认的index.js文件
  5. npx webpack
    注释: 有点同学会直接用webpack开头执行命令出现报错,是因为需要将webpack全局安装,但是不建议全局安装,因为版本不同,可能有些功能就不支持,这里的npx是npm下面的一个分支,因为npm是全局安装,故npx不会报错。

解析执行命令后的终端

终端图片
  1. hash: 每次打包后都会生成一个hash值,在没有任何配置的时候,这个hash是一个全局hash,就是所有文件共用这一个hash值,当任意用到hash值的文件内容发生变化的时候,打包的时候hash值都会发生改变,如果没有内容改变,则hash值不变
  2. Version: 当前安装webpack的版本号
  3. Time: 打包构建时间
  4. Built: 这里面有四个参数
    Asset: 构建后的入口文件
    Size: 项目构建后的尺寸
    Chunks: 这里的chunks是chunk的集合,如果mode模式是production模式,则这里的名字为为空,因为没有命名所以以模块id命名,development模式下则是具体的根据Asset命名
    Chunk Names: 每个chunk的文件名

配置文件

webpack启动的时候默认走 webpack.config.js 文件

webpack基本组成

  1. entry: 执行构建的入口文件
  2. output: 执行构建后的文件存放位置以及名称
  3. mode:执行构建的模式,有三种模式:none && production && development
  4. bundle: 执行构建后的文件本身
  5. chunk:执行构建后的文件里面的代码片段
  6. module: 模块化
  7. loader:webpack对于前端只支持.js/.json两种后缀文件,所以其他后缀名的文件需要引入相应的loader进行处理
  8. plugin:webpack的能力拓展,当webpack解决不了,则通过plugin引入插件

entry

执行构建的入口文件
支持字符串对象两种格式

entry: './src/index.js', // 字符串

entry: { // 对象
    index: './src/index.js'
}

如果是多文件入口,这里可以这样写:

entry: { // 对象
    index: './src/index.js',
    list: './src/list.js'
},

output

执行构建后的文件存放位置以及名称,为对象格式
path:执行构建后的资源存放位置,必须为绝对路径
filename: 执行构建后的名称,如果是多文件入口,则为[name].js
[name].js为webpack的占位符,具体可参考webpack官网占位符

output: {
    path: path.resolve(__dirname, "./dist"),
  // path: '/dist'
    filename: 'index.js'
  // filename: [name].js
},

mode

执行构建的模式
webpack有三种模式: none,development,production
production: 生产模式,默认会启动代码压缩
development: 开发模式,默认不会启动代码压缩,方便开发的时候定位代码

mode: 'production'

plugin

plugin是webpack的能力拓展,当webpack解决不了,则通过移入plugin的方式解决

举例1:html模板解析

需要引入html-webpack-plugin插件
安装: npm install html-webpack-plugin
注: 这里的\color{#f30}{htmlWebpackPlugin}定义为一个类函数,所以使用的时候,需要先实例化

const htmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
  plugins: [
    new htmlWebpackPlugin({
      template: './src/index.html',  // 找到入口文件
      filename: 'index.html'  // 执行构建后的文件名
    })
  ]
}

如果是多文件入口,则plugin实例化多次,同时入口entry配置为多文件入口

const htmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
  entry: { // 对象
    index: './src/index.js',
    list: './src/list.js'
  },
  plugins: [
    new htmlWebpackPlugin({
      template: './src/index.html',  // 找到入口文件
      filename: 'index.html'  // 执行构建后的文件名
    }),
    new htmlWebpackPlugin({
      template: './src/list.html',  // 找到入口文件
      filename: 'list.html'  // 执行构建后的文件名
    })
  ]
}

其中,构建后的每个html默认引入当前所有的js文件,那么,如果我们只想引入某个js, css怎么做呢?
借助chunks参数,设置该html依赖的js, css

const htmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
  entry: { // 对象
    index: './src/index.js',
    list: './src/list.js'
  },
  plugins: [
    new htmlWebpackPlugin({
      template: './src/index.html',  // 找到入口文件
      filename: 'index.html',  // 执行构建后的文件名
      chunks: ['index'] // 只引入index相应的.js, .css
    }),
    new htmlWebpackPlugin({
      template: './src/list.html',  // 找到入口文件
      filename: 'list.html',  // 执行构建后的文件名
      chunks: ['list'] // 只引入list相应的.js, .css
    })
  ]
}

loader

webpack对于前端来说,只支持.js、.json文件,换言而之,只能找对.js.json的后缀名文件进行处理,其他后缀名文件webpack不能识别,这个时候就需要用到loader来告诉webpack遇到的是哪些类型的文件,应该怎么处理。

举例1: .css文件

支持.css文件需要安装的loader有: css-loader, style-loader
安装: npm install css-loader && npm install style-loader
css-loader:这个loader作用非常单一, 只做了一件事,把css以js的方式放在了bundlewen文件里
style-loader: 这个loader就是把css以style的形式添加到页面上
注: 这里的use为数组的时候,有执行顺序,并且顺序为\color{#f30}{从右到左}
use使⽤⼀个loader可以⽤对象,字符串,两个loader需要⽤数组

  module: { // 允许在 webpack 配置中指定多个 loader
   rules: [
     {
       test: /\.css$/, // 正则找到相应的css后缀名
       use: ["style-loader", "css-loader"]  // 匹配相应的loader
     }
   ]
  },

最后会以style形式在当前页面引入
(如果想以link形式引入,可以借用extract-text-webpack-plugin将style中的css样式抽离出来)

image.png
举例2: 图片文件

支持图片的loader: file-loader
安装: npm install file-loader

module: { // 允许在 webpack 配置中指定多个 loader
   rules: [
     {
       test: /\.css$/, // 正则找到相应的css后缀名
       use: ["style-loader", "css-loader"]  // 匹配相应的loader
     },
     {
       test: /\.(png)$/, 
       use: 'file-loader'
     }
    
   ]
  },

但是在实际开发中,我们当时不可能只使用这一种格式的图片了,所以还可以这样写:

{
      test: /\.(png|jpg|jpeg|gif)$/, // 正则多种图片格式
      use: 'file-loader'  // 这里默认为hash命名
 }

同时这里的use支持可配置

{
      test: /\.(png|jpg|jpeg|gif)$/, // 正则多种图片格式
      use: {
        loader: 'file-loader', // 匹配相应的loader
        options: {
          name: '[name]_[hash].[ext]', // [name],[ext]都为占位符,为你的文件配置自定义文件名模板,这里如果不使用[hash],则不显示hash命名,就是普通命名
          outputPath: 'images/', // 构建后的图片存放路径,为自定义
          limit: 2048  //设置⼩于2048,才转换成base64
        }
      }
    }

chunk

简而言之,就是一个代码片段。一个文件中引入其他的依赖包,比如:index.js里面引入了index.css,common.js,打包构建后,打包生成的 index.css 和 index.js 都属于 chunk 0, 这是属于一个chunk,具体参考博客:webpack 中那些最易混淆的 5 个知识点

引用上面链接中博客图片

bundle

简而言之,就是文件本身,chunk是bundle里面的代码片段,两者关系是一对一的包含关系,但是,有些配置不会产生一对一的关系。比如上图中: 使用 MiniCssExtractPlugin 从 chunks 0 中抽离出了 index.bundle.css 文件。则chunk0对应两个bundle文件

相关文章

网友评论

      本文标题:webpack系列文章之入门篇

      本文链接:https://www.haomeiwen.com/subject/bhgvrktx.html