Webpack 是一个打包模块化 JavaScript 的工具,在 Webpack 里一切文件皆模块,通过 Loader 转换文件,通过 Plugin 注入钩子,最后输出由多个模块组合成的文件。Webpack 专注于构建模块化项目。其官网的首页图很形象的画出了 Webpack 是什么,如下:
一切文件:JavaScript、CSS、SCSS、图片、模板,在 Webpack 眼中都是一个个模块,这样的好处是能清晰的描述出各个模块之间的依赖关系,以方便 Webpack 对模块进行组合和打包。经过 Webpack 的处理,最终会输出浏览器能使用的静态资源。
Webpack的优点是:
Webpack的缺点是只能用于采用模块化开发的项目。
经过多年的发展, Webpack 已经成为构建工具中的首选,这是有原因的:
// 初始化package.json
npm init -y
// 安装webpack 和 webpack-cli
npm install webpack@4.41.2 webpack-cli@3.3.10 -D
在根目录下新建src文件,在src文件中新建Header.js和index.js Header.js:
function Header(){
const dom = document.getElementById('app')
const header = document.createElement('div')
header.innerHTML = 'Header'
dom.appendChild(header)
}
export default Header;
index.js:
import Header from './Header.js'
new Header()
const path = require('path');
module.exports = {
mode:'development',
// JavaScript 执行入口文件
entry:path.join(__dirname,'./src/index.js'), // 入口
output: {
// 把所有依赖的模块合并输出到一个 bundle.js 文件
filename: 'bundle.js',
// 输出文件都放到 dist 目录下
path: path.resolve(__dirname, './dist'),
}
};
npx weback
目录结构:
本示例提供完整代码:链接: https://pan.baidu.com/s/1Eexn4jVMnHUYwl4JI9GRwg 提取码: ea6m
在package.json文件设置build命令
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build":"webpack"
},
打包直接使用npm run build
npm install file-loader --save-dev
const path = require('path');
module.exports = {
// JavaScript 执行入口文件
mode:'development',
entry:path.join(__dirname,'./src/index.js'), // 入口
output: {
// 把所有依赖的模块合并输出到一个 bundle.js 文件
filename: 'bundle.js',
// 输出文件都放到 dist 目录下
path: path.resolve(__dirname, './dist'),
},
module: {
rules:[
{
test:/\.(png|jpe?g|gif)$/i,
use:[
{
loader: 'file-loader',
options:{ // options对file-loader进行配置
name:'[name].[ext]', // 产出文件名字
outputPath:'imgs/' // 产出文件存放地:将打包后的图片放到dist/imgs文件中
}
}
]
}
]
}
};
重点:file-loader让打包生成后的图片文件与源码代码的图片文件名称一致
重点:
npm install url-loader --save-dev
const path = require('path');
module.exports = {
// JavaScript 执行入口文件
mode:'development',
entry:path.join(__dirname,'./src/index.js'), // 入口
output: {
// 把所有依赖的模块合并输出到一个 bundle.js 文件
filename: 'bundle.js',
// 输出文件都放到 dist 目录下
path: path.resolve(__dirname, './dist'),
},
module: {
rules:[
{
test:/\.(png|jpe?g|gif)$/i,
use:[
{
loader:'url-loader',
options:{
name:'[name].[ext]',
outputPath:'imgs/',
limit:20480 // 如果图片文件大于20KB,就会单独生成 XXX.jpg 文件;如果小于20KB,直接解析成base64字符串 -》 设置img src属性上
}
}
]
}
]
}
};
图片很大 -》 base64字符串很大 -》bundle.js体积很大 -》 index.html加载 bundle.js时间就会很长
图片很大 -》 file-loader -> 单独生成 XXX.jpg文件 -》 index.html 引入XXX.jpg文件 -》 bundle.js 体积就会很小 -》 页面加载快
图片很小 -》 file-loader -> 单独生成 XXX.jpg 文件 -》 多发送一次HTTP请求
图片很小 -》 url-loader -> 解析成base64字符串 -》 设置img src属性上 -》不需要发送额外的请求图片的HTTP请求
本示例提供完整代码:链接: https://pan.baidu.com/s/1O-AE5ess925Kqis4uD9kQg 提取码: ktd2
npm install --save-dev css-loader style-loader
const path = require('path');
module.exports = {
// JavaScript 执行入口文件
mode:'development',
entry:path.join(__dirname,'./src/index.js'), // 入口
output: {
// 把所有依赖的模块合并输出到一个 bundle.js 文件
filename: 'bundle.js',
// 输出文件都放到 dist 目录下
path: path.resolve(__dirname, './dist'),
},
module: {
rules:[
{
test:/\.(png|jpe?g|gif)$/i,
use:[
{
loader:'url-loader',
options:{
name:'[name].[ext]',
outputPath:'imgs/',
limit:20480
}
}
]
},
{
test:/\.css$/i,
use:[// loader 的执行顺序:从后往前,从下往上,先执行css-loader,后执行style-loader
"style-loader",
"css-loader"
]
}
]
}
};
npm install sass-loader@12.1.0 node-sass@5.0.0 --save-dev //安装对应的版本
// css3属性,对低版本做兼容
npm i- D postcss-loader
// 需要配合postcss.config.js文件使用
npm install autoprefixer -D
autoprefixer 可以加上厂商前缀
例如: -ms-input-placeholder{
color:grey;
}
module.exports = {
plugins: [
require('autoprefixer')
]
}
"keywords": [],
"browersList": [
"> 1%", // 市场份额大于1%
"last 2 versions" // 并且兼容上两个版本
],
const path = require('path');
module.exports = {
// JavaScript 执行入口文件
mode:'development',
entry:path.join(__dirname,'./src/index.js'), // 入口
output: {
// 把所有依赖的模块合并输出到一个 bundle.js 文件
filename: 'bundle.js',
// 输出文件都放到 dist 目录下
path: path.resolve(__dirname, './dist'),
},
module: {
rules:[
{
test:/\.(png|jpe?g|gif)$/i,
use:[
{
loader:'url-loader',
options:{
name:'[name].[ext]',
outputPath:'imgs/',
limit:20480
}
}
]
},
{
test:/\.scss$/i,
use:[
"style-loader",
// 对css-loader进行配置
{
loader:'css-loader',
options: {
importLoaders:2 //scss文件嵌套引用时,也会去使用postcss-loader和sass-loader
}
},
"postcss-loader",
"sass-loader"
]
}
]
}
};
本示例提供完整代码:链接: https://pan.baidu.com/s/1hAm5zY-YUcL6GnWt3eF4Qg 提取码: ywgq