必背-9.webpack
webpack是什么
- webpack(web应用打包工具)是自动打包部署工具
- 优点:
- 可以把css、js按照依赖关系,打包合并成一个(压缩)
- Eslint词法检测(检测语法是否符合规则)
- 小图转为base64格式编码
- 想用webpack必须要安装nodejs,webpack的安装和使用,是基于npm包管理器来完成的
- 缺点:webpack打包(可以看成一个平台),需要下载各种插件,插件越多,打包速度会变慢
模块化开发
什么是模块化,模块化的发展史?
模块化开发:B.js文件里面使用了A.js的方法,则说明B.js需要依赖于A.js才能完成功能,存在依赖关系
-
单例设计模式:最早的模块化,但是对引入文件的顺序要求严格:比如B.js依赖于A.js,则必须先引入A.js再引入B.js
- 缺点:虽然解决了模块化开发,防止了全局变量污染,但是依赖关系把数据处理变得
异常恶心 -
AMD[require.js]:AMD思想是在单例模式的基础上,实现了对依赖的管控。
-
应用:grunt/glup/fis 都是基于AMD思想实现的 -
管控模式(缺点):依赖前置,在具体开发模块代码之前,先把需要的依赖处理好,再开始开发 -
用法:使用define导出,使用require导入。
-
let A=define(function(){
let sum=function sum(...parmas){
return parmas.reduce((res,item)=>res+item);
}
return {sum};
})
let B=define(["A"],function(A){
const average=function average(...parmas){
parmas.sort((a,b)=>a-b).pop();
parmas.shift();
return A.sum(...parmas)/parmas.length;
};
return {average} ;
})
require.config({
baseUrl: "./lib"
})
require(["A", "B"], function (A, B) {
console.log(A.sum(1, 23, 2, 4, 53, 8));
console.log(B.average(1, 23, 2, 4, 53, 8));
})
-
Common.js:应用在服务器端[node]的模块化
-
CMD[sea.js]:应用在浏览器端的模块化,旨在让Common.js能够在浏览器运行,但后期被webpack干掉了 -
ES6Module:ES6新增的模块化,主要应用在浏览器端的模块化
-
**优点:**我们以后在浏览器端模块化开发时,都会用ES6Module开发 -
注意点:我们在html文件中导入模块时必须声明==type="module" :==<script type="module" src="./A.js"></script> -
**用法:**用export/export default导出模块,用import导入模块,一个模块可以导入无数次
webpack使用
为什么使用webpack?
webpack主要构成是什么?
- webpack是一个基于nodejs实现的平台
- 存在入口和出口:
- ==入口:==从哪个文件开始打包编译
- ==出口:==打包的文件放到哪里
- mode:模式,存在生产环境(production)和开发环境(development)
- 生产环境:production,自动压缩
- 开发环境:development,不压缩
- loader:加载器,编译用的,(webpack只能识别Es5的js文件)
- 如果是es6的js文件、css、图片等文件,则无法识别,我们需要安装插件使它能自动编译成webpack能识别的代码格式
- plugins:插件,打包压缩文件
- 优化项…
webpack支持什么格式的规范?
- webpack即支持ES6Module,又支持CommonJS规范,而且两个规范可以混用
wepack如何使用?
- 我们需要把配置写在项目的==
webpack.config.js ==文件中,可配置:entry/output/mode/loader/plugins/优化项... - 执行webpack命令,配置好的内容会进行一系列的处理:文件编译、打包(合并)、压缩…
-
webpack的安装方式?
webpack的默认打包?
- wepack有默认的打包路径:我们不需要配置
webpack.config.js ,就可以打包
- 默认入口是:
文件夹/src/index.js - 默认出口是:
文件夹/dist/main.js (如果没有,会自动生成)
webpack的打包命令?
- 使用全局的webpack:直接在命令行窗口执行
webpack - 使用自己项目中的webpack:
- 需要在
package.json 中的"scripts" 属性下配置"xxx":"webpack" ,"xxx"是自定义名,然后在命令窗口中执行npm run xxx 来实现打包; - 或者版本在5.2以上,直接使用
npx webpack 打包
执行webpack打包命令触发的查找机制?
webpack使用步骤
webpack在项目中配置的步骤?
- 第一步:删除全局的webpack:
npm uninstall webpack webpack-cli -g - 第二步:安装局部的webpack:
npm i webpack webpack-cli --save-dev - 第三步:检查项目目录中是否存在src路径,src中是否存在index.js目录
- 第四步:在
package.json 中的"scripts" 属性下配置"xxx":"webpack" ,"xxx"是自定义名,然后在命令窗口中执行npm run xxx 来实现打包【使用默认打包方式:默认打包index.js ,默认生成在:dist/main.js】 - 第五步:配置
webpack.config.js ,实现自定义的控制webpack打包配置
webpack配置文件
wepack的配置文件?
- webpack的配置文件有三种形式:
webpack.config.js :wepack默认寻找的配置文件,但是我们一般会把它拆分为两个模式文件:production 和development
- 脚本命令:
"dev":"webpack --config webpack.min.js" 可简写为:"dev":"webpack" webpack.config.production.js :专门执行webpack生产环境的配置文件
- 脚本命令:
"build":"webpack --config webpack.config.production.js" webpack.config.development.js :专门执行webpack开发环境的配置文件
- 脚本命令:
"build":"webpack --config webpack.config.development.js"
如何在一个webpack.config.js 文件下实现执行不同的环境(生产或开发)?
- 我们在项目开发一般创建
开发环境配置文件 与生产环境配置文件 两个配置文件,但是如何实现两个环境放在同一个配置文件中,且能根据命令分环境执行命令内容呢? - 第一步:需要引入
cross-env 依赖:npm i cross-env --save-dev - 第二步:通过配置
package.json 的scrpit脚本命令,实现执行不同的环境
"D":"cross-env Node_ENV=development webpack" :执行开发环境"P":"cross-env Node_ENV=producton webpack" :执行生产环境 - 第三步:在webpack中声明一个变量
let NODE_ENV=process.env.NODE_ENV||'development'
process.env.NODE_ENV :是通过脚本命令中的cross-env xxx 传过来的值,如果传过来的值是undefined,则默认赋值development 环境mode:NODE_ENV :环境根据变量来决定filename:NODE_ENV==='development'?"bundle.[hash].js":"bundle.[hash].min.js"
- 第四步:运行:
npm run D :执行开发环境npm run P :执行生产环境npm run dev :因为没有传NODE_ENV 变量值,所以默认执行开发环境
wepack.config.js配置项
webpack在node环境下执行,所以对于模块化的导入和导出,需要遵循node.js规范
生产者模式
let path=require("path");
module.exports({
mode:"production",
entry:"./src/aaa.js",
output:{
filename:"bundle.[hash].min.js",
path:path.resolve(__dirname,"dist")
}
})
开发者模式
module.exports({
mode:"development",
entry:"./src/aaa.js",
output:{
filename:"bundle.[hash].js",
path:path.resolve(__dirname,"dist")
}
})
|