webpack 是一个开源的javascript模块打包工具,其最核心的功能是解决模块之间的依赖,把各个模块按照制定的规则和顺序组织在一起,最终合并为一个JS文件(有时候有多个)。这个过程就叫做模块打包。 你可以把webpack理解为一个模块处理工厂。我们把源代码交给webpack,由它去进行加工、拼装处理,产出最终的资源文件,等待送往用户。 抛出疑问?-->为什么不直接将工程中的源文件发布到服务器或CDN,而交给webpack处理呢?? 开发一个简单web应用,只需要浏览器和编辑器,但是应用规模大了之后,就必须借助工具,否则人工维护代码的成本就变得难以接受。学会使用工具可以让开发效率成倍地提升,“工欲善其事,必先利其器”就是这个意思。 javascript中的模块 在过去很长一段时间里,js这门语言并没有模块这一概念。如果工程中有多个js文件,我们只能通过script标签将它们一个个插入页面中。 随着技术的发展,js用来实现的功能场景越来越复杂,我们发现这种做法有很多缺点: 模块化解决了上述的所有问题 模块打包工具的任务就是解决模块间的依赖,使其打包后的结果能运行在浏览器上。它的工作方式主要分为两种: webpack-dev-server 的作用是启动一个本地服务,可以处理打包资源与静态文件的请求。它的live-reloading功能可以监听文件变化,自动刷新页面来提升开发效率。 模块 CommonJs中规定每个文件是一个模块。将一个JavaScript文件直接通过script标准插入页面中与封装成CommonJs模块最大的不同在于,前者的顶层作用域是全局作用域,在进行变量及函数声明时会污染全局环境;而后者会形成一个属于模块自身的作用域,所有的变量及函数只有自己能访问,对外是不可见的。 导出 导出是一个模块向外暴露自身的唯一方式。在CommonJs中,通过module.exports可以导出模块中的内容。 导入 在commonJs中使用require进行模块导入。: 非模块文件 非模块化文件指的是并不遵循任何一种模块标准的文件。最常见的就是script标签中引入的jQuery及其各种插件。 如果使用webpack打包这类文件呢?其实只要直接引入就行,如: import './jquery.min.js' CommonJs 和ES6 Module 是目前使用较为广泛的模块标准。它们的主要区别在于前者建立模块依赖关系是在运行时,后者是在编译时;在模块导入方面,CommonJs导入的是值拷贝,Es6 Module导入的是只读的变量映射。 webpack打包模块,可以理解为类似于工厂中的产品组装,将一个个零件拼起来得到最终的成品。 本章主要关注资源的输入和输出,即如何定义产品的原材料从哪里来,以及组装后的产品送到哪里去。 webpack “一切皆模块”的思想 loader就像webpack的翻译官。webpack本身只能接受javascript,为了使其能够处理其他类型的资源,必须使用loader将资源转译为webpack能够理解的形式。 在配置loader时,实际上定义的是模块规则(modules.rules),它主要关注两件事:该规则对哪些模块生效(test、exclude、include配置),使用哪些loader(use配置)loader可以是链式的,并且每一个都允许拥有自己的配置项。 loader本质上是一个函数。第一个loader的输入是源文件,之后所有loader的输入是上一个loader的输出。最后一个loader则直接输出给webpack。 实现高性能应用其中重要的一点就是尽可能地让用户每次只加载必要的资源。代码分片(code solitting)是webpack作为打包工具所特有的一项技术,使用户不必一次全部加载,而是按需加载。第一章----何为Webpack
为什么需要webpack?
模块打包工具
安装
npm init
接下来执行按照webpack的命令:
--webpack是核心模块,webpack-cli则是命令行工具,在本例中两者都是必需的
npm install webpack webpack-cli --save-dev
//注意 因为webpack安装在了本地,因此无法直接在命令行内使用“webpack”,
//工程内部只能使用npx webpack <command>的形式 npx webpack -v 查看版本号
打包第一个应用程序
package.json文件中添加:
"scripts": {
"build":"webpack" //把一些参数对象放到webpack的默认配置文件中webpack.config.js
},
webpack.config.js文件中添加:
module.exports={
entry:'./index.js', //入口文件,不过默认的一般是./src/index.js
output:{
filename:'bundle.js',
},
mode:'development'
}
启动命令 : npm run build
抛出一个问题:每次修改都需要执行npm run build 更新bundle.js ,这种太麻烦了。
webpack-dev-server
npm install webpack-dev-server --save-dev
//--save-dev 参数是将webpack-dev-server 作为工程的devDependencies(开发环境依赖)记录在package.json
// webpack-dev-server的2大职能
1、令webpack进行模块打包,并处理打包结果的资源请求
2、作为普通的Web Server,处理静态资源文件请求
启动webpack-dev-server需要配置:
1)package.json 中添加dev指令
"scripts": {
"dev":"webpack-dev-server"
}
2)webpack.config.js文件中添加
module.exports={
devServer:{
publicPath:'/dist'
}
}
第2章----模块打包
但下述为ES6方式写模块:caluator.js
export default {
name: 'caluator',
add: function (a,b){
return a+b;
}
}
但该代码为es6 Module方式,如-->index.js 导入
import caluator from './caluator.js';
console.log(caluator.add(2,4));//6
加载其他类型模块
加载npm模块
下面以lodash 这个库为例:
npm install lodash
加载使用,只需要引入包的名字即可:
import _ from 'lodash'
原理是当加载该模块是,实际上加载的是node_mudules/lodash/lodash.js
除此之外,我们还可以通过path的形式单独家在模块内部的某个js文件。如:
import all from 'lodash/fp/all.js'
这样webpack最终只会打包node_modules/lodash/fp/all.js这个文件,通过这种方式可以减少打包资源的体积。
第3章----资源的输入输出
第4章----预处理器
第6章----代码分片