webpack初探 - (一)
什么webpack
webpack是一个模块打包器。webpack把模块连同它的依赖一起打包生成包含这些模块的静态资源。
安装
在使用webpack时,建议不要把webpack安装到全局,如果多个项目同时使用webpack的时,很有可能会导致因为版本的不同会导致冲突。
这里主要说的的webpack 3.0+版本。
安装方法
npm install webpack webpack-cli --save-dev
webpack 核心概念
- Entry:入口,在
webpack执行构建的第一步将从Entry开始,可抽象输入。 - Module:模块,在
webpack里一切皆是模块,一个模块对应一个文件,webpack会从配置的Entry开始递归找出所有依赖的模块。 - Chunk:代码块,一个
Chunk由多个模块组合而成,用于代码合并与分割。 - Loader:模块转换器,用于将模块的原内容按照需求转换成新内容。
- Plugin:扩展插件,在
webpack构建流程中的特定时间注入扩展逻辑,来改变构建结果或做我们想要做的事情。 - 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的配置有关。
- 如果
entry是一个String或Array,就只会生成一个Array,就只会生成一个Chunk,这时Chunk的名称是main。 - 如果
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"
}
}
hash和chunkhash的长度是可指定的,[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类型的绝对路径。通常通过Node的path模块去获取绝对路径。
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.path和output.publicPath都支持字符串模板,内置变量只有hash一个,代表一次编译操作的hash的值。
# crossOriginLoading
output.crossOriginLoading用于配置异步插入的标签的crossorigin值。
script标签的crossorigin的属性可以取以下值:
anonymous(默认),在加载此脚本资源时不会带上用户的Cookies。use-credentials,在加载此脚本资源时会带上用户的Cookies。
const path = require('path');
module.exports = {
output:{
// 异步加载资源使用方式
// 1.带有Cookies
crossOriginLoading:"anonymous",
// 2.不带Cookies
crossOriginLoading:"use-credentials"
}
}
# libraryTarget和library
使用webpack去构建一个可以被其他模块导入的库时需要使用到libraryTarget和library。
output.libraryTarget配置以何种方式导出库。
output.library配置导出库的名称。
他们通常搭配在一起使用。
output.libraryTarget是字符串的枚举类型。
可选值有:
- umd
- umd2
- commonjs2
- common
- amd
- this
- var
- assign
- window
- global
- 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初探 - (一)的更多相关文章
- gulp和webpack初探
gulp 真正“流程”化工具 我记得实习刚刚进公司看到grunt,还是有点蒙,之前一直是本地开发,游览器F5,没想到前端也需要“编译工具”.所以grunt一直给我的感觉是“编译工具”,你写的很多代码还 ...
- 【webpack学习笔记(一)】流行的前端模块化工具webpack初探
从开发文件到生产文件 有一天我突然意识到一个问题,在使用react框架搭建应用时,我使用到了sass/less,JSX模版以及ES6的语法在编辑器下进行开发,使用这些写法是可以提高开发的效率.可是 ...
- 【webpack】流行的前端模块化工具webpack初探
从开发文件到生产文件 有一天我突然意识到一个问题,在使用react框架搭建应用时,我使用到了sass/less,JSX模版以及ES6的语法在编辑器下进行开发,使用这些写法是可以提高开发的效率.可是 ...
- webapck学习笔记
该笔记是博主学习webpack课程时做的笔记,里面加了一些自己的一些理解,也踩了一些坑,在笔记中基本上都更正过来了,分享给大家,如果发现什么问题,望告知,非常感谢. 1. 为什么要学webapck 为 ...
- 初探webpack之编写plugin
初探webpack之编写plugin webpack通过plugin机制让其使用更加灵活,以适应各种应用场景,当然也大大增加了webpack的复杂性,在webpack运行的生命周期中会广播出许多事件, ...
- 初探webpack之从零搭建Vue开发环境
初探webpack之搭建Vue开发环境 平时我们可以用vue-cli很方便地搭建Vue的开发环境,vue-cli确实是个好东西,让我们不需要关心webpack等一些繁杂的配置,然后直接开始写业务代码, ...
- 初探webpack之编写loader
初探webpack之编写loader loader加载器是webpack的核心之一,其用于将不同类型的文件转换为webpack可识别的模块,即用于把模块原内容按照需求转换成新内容,用以加载非js模块, ...
- webpack练手项目之easySlide(一):初探webpack (转)
最近在学习webpack,正好拿了之前做的一个小组件,图片轮播来做了下练手,让我们一起来初步感受下webpack的神奇魅力. webpack是一个前端的打包管理工具,大家可以前往:http:/ ...
- 初探webpack之环境配置
先感叹一句,前端的发展真是太快了,ng和bb还没怎么学好就要过时了.现在感觉react当是未来的一个大方向. 以前一直用的grunt,不过前段时间作者已经停止更新了.正好webpack风头正盛,咱也不 ...
随机推荐
- 【codeforces 698B】 Fix a Tree
题目链接: http://codeforces.com/problemset/problem/698/B 题解: 还是比较简单的.因为每个节点只有一个父亲,可以直接建反图,保证出现的环中只有一条路径. ...
- SQL基础操作汇总
SQL基础操作汇总 一.表操作 1.表的创建(CREATE TABLE): 基本语句格式: CREATE TABLE table_name ( col_name datatype, -- ...
- MYSQL—— Insert的几种用法!
向表中插入数据 标题头示例图如下: 用insert插入值得方式: 1.使用如下语句进行插入值操作,要求:插入值必须与表头给出列数值一致,否则报:[Err] 1136 - Column count do ...
- set的便捷操作
认识集合 由一个或多个确定的元素所构成的整体叫做集合. 集合中的元素有三个特征: 1.确定性(集合中的元素必须是确定的) 2.互异性(集合中的元素互不相同.例如:集合A={1,a},则a不能等于1) ...
- Docker最全教程——Redis容器化以及排行榜实战(十三)
前言 容器教程的路还很长,笔者尽量根据实践来不断地完善.由于在编写的过程中还会有完善和补充,后续可能会以番外来补充. 接下来会分享TeamCity.树莓派等内容,节奏可能会有点跳脱. 另外,长沙.NE ...
- 从壹开始前后端分离 40 || 完美基于AOP的接口性能分析
旁白音:本文是不定时更新的.net core,当前主线任务的Nuxt+VueAdmin教程的 nuxt.js 之 tibug项目已上线,大家可以玩一玩:http://123.206.33.109:70 ...
- mysql数据库NO CONNECTION问题分析以及解决方案
自己的站点有时候会挂掉,着实比较麻烦,我不会24小时都看着,说多的都是泪 出现mysql出现NO CONNECTION 有可能原因:mysql服务出现问题 解决方案:重启mysql服务,数据库就连接上 ...
- ssm客户管理系统的设计与实现
ssm客户管理系统 注意:系统是在实现我的上一篇文章 https://www.cnblogs.com/peter-hao/p/ssm.html的基础上开发 1 需求 1.1 添加客户 客户 ...
- jqgrid three 树形结构
最近我们的表格中,需要更改数据的显示方式,就是jqgrid中以树形的方式显示.请先看图: 就是简单的这种从属方式.但是因为这个没有找到官方的文档(后来找到了,但是发现是翻译过来的,也不是很清楚),所以 ...
- JavaScript对象类型判断注意点
注意点 不要使用 new Number() . new Boolean() . new String() 创建包装对象:用 parseInt() 或 parseFloat() 来转换任意类型到numb ...