分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

webpack初探 - (一)

发布时间:2023-09-06 02:15责任编辑:林大明关键词:webpack
什么webpack

webpack是一个模块打包器。webpack把模块连同它的依赖一起打包生成包含这些模块的静态资源。

安装

在使用webpack时,建议不要把webpack安装到全局,如果多个项目同时使用webpack的时,很有可能会导致因为版本的不同会导致冲突。

这里主要说的的webpack 3.0+版本。

安装方法

npm install webpack webpack-cli --save-dev

webpack 核心概念
  1. Entry:入口,在webpack执行构建的第一步将从Entry开始,可抽象输入。
  2. Module:模块,在webpack里一切皆是模块,一个模块对应一个文件,webpack会从配置的Entry开始递归找出所有依赖的模块。
  3. Chunk:代码块,一个Chunk由多个模块组合而成,用于代码合并与分割。
  4. Loader:模块转换器,用于将模块的原内容按照需求转换成新内容。
  5. Plugin:扩展插件,在webpack构建流程中的特定时间注入扩展逻辑,来改变构建结果或做我们想要做的事情。
  6. Output:输出结果,在webpack结果一系列处理并得出最终想要的代码后输出结果。
配置
context

webpack在寻找相对路径的文件时会以context为根目录,context执行启动webpack时默认为所在的当前工作目录。

context必须是绝对路径。

const path = require(‘path‘);module.exports = { ???context: __dirname}
Entry

entry是配置模块的入口,webpack执行构建的第一步从entry开始。

entry类型可以是以下三种中的一种或者互相组合。

const path = require(‘path‘);module.exports = { ???// 第一种 ???// 入口模块的文件路径,可以是相对路径 ???entry:"./main.js", ???// 第二种 ???// 入口模块的文件路径,可以使相对路径 ???entry:[‘./app/entry1‘,‘./app/entry2‘] ???// 第三种 ???// 配置多个入口,每个入口生成一个chunk ???entry:{ ???????a:‘./app/entry-a‘, ???????b:[‘./app/entry-b1‘,‘./app/entry-b2‘] ???}}

如果是array类型,则搭配output.library配置项使用时,只有数组里的最后一个入口文件的模块会被导出。

# chunk

webpack会为每个生成的chunk取一个名称,chunk的名称和entry的配置有关。

  1. 如果entry是一个StringArray,就只会生成一个Array,就只会生成一个Chunk,这时Chunk的名称是main
  2. 如果Entry是一个object,就可以能会出现多个Chunk,这时Chunk的名称是Object键值对中键的名称

Chunk包含信息如下

变量名 含义

id chunk的唯一标识,从0开始

name chunk名称

hash chunk的唯一标识的hash值

chunkhash chunk内容的hash值

# 配置动态Entry

如果一个项目里面需要配置多个页面,然而又需要为这些页面分别配置一个entry入口,但是这些页面的数量可能会不断的增长,这时entry的配置会受到其他因素的影响,导致不能写成静态的值。

const path = require(‘path‘);module.exports = { ???// 同步函数 ???entry:() => { ???????return { ???????????a:‘./pages/a‘, ???????????b:‘./pages/b‘ ???????} ???}, ???// 异步函数 ???entry:() => { ???????return new Promise((resolve) => { ???????????resolve({ ???????????????a:‘./pages/a‘, ???????????????b:‘./pages/b‘ ???????????}) ???????}) ???}}
output

output配置如何输出最终想要的代码。output是一个object,里面包含一系列的配置项。

# filename

output.filename配置输出文件的名称,为string类型。如果只输出一个文件,则可以将它写成静态不变的。

但是有多个Chunk要输出时,就需要借助模板和变量,webpack会为每个Chunk取一个name,所以我们可以根据Chunk的名称来区分输出的文件名。

const path = require(‘path‘);module.exports = { ???output:{ ???????// 单个文件 ???????filename:"index.js", ???????// 多个文件 ???????filename:"[name]_[hash:8].js", ???????// 根据文件内容的hash值生成文件名,用来浏览器长期缓存文件 ???????filename:"[chunkhash].js" ???}}

hashchunkhash的长度是可指定的,[hash:8]代表取8位hash值作为文件名称。

name代表Chunk内置的name去替换掉[name],每个要输出的Chunk都会通过这个函数去拼接输出的文件名称。

# chunkFilename

output.chunkFilename是用来配置当无入口文件时输出的文件名称。chunkFilename只用于指定在运行过程中生成的Chunk在输出时的文件名称。

const path = require(‘path‘);module.exports = { ???output:{ ???????// 附加chunk的文件名称 ???????chunkFilename:"[id].js", ???????chunkFilename:"[chunkhash].js" ???}}
# path

output.path配置输出文件存放在本地的目录,必须是String类型的绝对路径。通常通过Nodepath模块去获取绝对路径。

const path = require(‘path‘);module.exports = { ???output:{ ??????path:path.resolve(__dirname,"./dist") ???}}

注意:第二个参数为最终输出到的文件名,如果文件名不存在,则会自行创建一个同名的文件夹,并把导出的文件放到该文件夹里面。

# publicPath

output.publicPath配置发布到线上资源需的URL前缀,为string类型。默认值是空字符串。

const path = require(‘path‘);module.exports = { ???output:{ ???????// 放到CDN上 ???????publicPath:‘https://cdn.example.com‘, ???????// 放到指定目录下 ???????publicPath:"/assets/", ???????// 放到根目录下 ???????publicPath:"" ???}}

output.pathoutput.publicPath都支持字符串模板,内置变量只有hash一个,代表一次编译操作的hash的值。

# crossOriginLoading

output.crossOriginLoading用于配置异步插入的标签的crossorigin值。

script标签的crossorigin的属性可以取以下值:

  1. anonymous(默认),在加载此脚本资源时不会带上用户的Cookies
  2. use-credentials,在加载此脚本资源时会带上用户的Cookies
const path = require(‘path‘);module.exports = { ???output:{ ???????// 异步加载资源使用方式 ???????// 1.带有Cookies ???????crossOriginLoading:"anonymous", ???????// 2.不带Cookies ???????crossOriginLoading:"use-credentials" ???}}
# libraryTarget和library

使用webpack去构建一个可以被其他模块导入的库时需要使用到libraryTargetlibrary

output.libraryTarget配置以何种方式导出库。

output.library配置导出库的名称。

他们通常搭配在一起使用。

output.libraryTarget是字符串的枚举类型。

可选值有:

  1. umd
  2. umd2
  3. commonjs2
  4. common
  5. amd
  6. this
  7. var
  8. assign
  9. window
  10. global
  11. jsonp
const path = require(‘path‘);module.exports = { ???output:{ ???????// 导出库名称,为String类型 ???????// 不填写时,默认的输出格式是匿名的立即执行函数 ???????library:"myLibrary", ???????// 导出库的类型,为枚举类型,默认为var ???????libraryTarget:"umd" ???}}
# libraryExport

output.libraryExport配置要导出的模块中那些子模块需要被导出。只有output.libraryTarget被设置成commonjs或者commonjs2的时候才有效。

const path = require(‘path‘);module.exports = { ???output:{ ???????libraryExport:[‘a‘,‘b‘] ???}}

lib_code是指导出库的代码内容,是有返回值的一个自执行函数。

整体配置

在进行配置的时候并不是所有的参数都要填写,而是需用用到哪些就填写哪些参数,总而言之就是根据自己的业务需求去定制自己需要的配置。

const path = require(‘path‘);module.exports = { ???context:__dirname, ???entry:"./main.js", ???output:{ ???????filename:"[chunkhash].js", ???????path:path.resolve(__dirname,"./dist"), ???}}

webpack初探 - (一)

原文地址:https://www.cnblogs.com/aaron---blog/p/9661489.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved