webpack4打包jquery项目
jquery的多页项目,不需要安装依赖,开发阶段也不需要启动本地服务器,直接在浏览器打开,很多情况下用jquery开发还是很方便很快捷的;也会有一些痛点,比如浏览器缓存问题,更新了图片,css或js后,如果引入路径或文件名称不变的话,用户访问的资源可能还是从浏览器缓存获取的旧资源,手动维护文件名称或引入路径又很麻烦,这就需要引入webpack了
webpack4 安装依赖
package.json
"devDependencies": {
"copy-webpack-plugin": "^5.1.1",
"css-loader": "^3.4.0",
"extract-text-webpack-plugin": "^4.0.0-beta.0",
"file-loader": "^5.0.2",
"html-loader": "^0.5.5",
"html-webpack-plugin": "^3.2.0",
"style-loader": "^1.1.2",
"url-loader": "^3.0.0",
"webpack": "^4.41.5",
"webpack-cli": "^3.3.10",
"webpack-dev-server": "^3.10.1"
}
多入口
多个页面,就有多个入口,除非有些共性很大的页面可以用同一个入口
entry: {
index: "./entry/index.js",
list: "./entry/list.js",
item: "./entry/item.js"
}
用HtmlWebpackPlugin插件自动生成页面(注:item1.html和item2.html的css和js都相同,使用的是同一个入口item)
plugins: [
new HtmlWebpackPlugin({
chunks: [\'index\', \'common\'],
template: \'./src/index.html\',
filename: \'index.html\'
}),
new HtmlWebpackPlugin({
chunks: [\'list\', \'common\'],
template: \'./src/list.html\',
filename: \'list.html\'
}),
new HtmlWebpackPlugin({
chunks: [\'item\', \'common\'],
template: \'./src/item1.html\',
filename: \'item2.html\'
}),
new HtmlWebpackPlugin({
chunks: [\'item\', \'common\'],
template: \'./src/item2.html\',
filename: \'item2.html\'
})
]
jquery项目的资源分类
首先先对项目的资源进行一个分类,不同的种类采用不同的处理方式
- css和js
- 第三方库的css和js
- 多个页面公共的css和js
- 单个页面的css和js
- 图片
- css中的图片
- html中的图片(img标签的src,img标签的data-src等等)
- 字体文件
种类分析:
【第三方库的css和js】和【字体文件】:这类资源是不会经常改变的,在html的head引入,用CopyWebpackPlugin插件将资源拷贝到最终的目录
new CopyWebpackPlugin([
{
from: path.join(__dirname, \'./src/js\'),
to: path.join(__dirname, \'./dist/js\')
},
{
from: path.join(__dirname, \'./src/css\'),
to: path.join(__dirname, \'./dist/css\')
}
])
【多个页面公共的css和js】:这类资源是会变的,直接拷贝会有缓存问题,又因为是公共的,提取出来可以减少页面的重复请求,在入口文件里引入,并用webpack.optimization.splitChunks提取公共部分
optimization: {
splitChunks: {
chunks: \'all\',
cacheGroups: {
common: {
name: \'common\',
minChunks: 2 //最少被2个chunk引用
}
}
}
}
【单个页面的css和js】:在入口文件里引入
// entry/index.js
import \'../src/css/reset.css\'
import \'../src/css/common.css\'
import \'../src/css/index.css\'
import \'../src/css/media.css\'
import common from \'../src/js/common.import\';
common()
【css中的图片】:可直接通过url-loader处理
{
test: /\.(gif|jpg|png|woff|svg|eot|ttf)\??.*$/,
use: [
{
loader: \'url-loader\',
options: {
name: \'img/[name].[hash:8].[ext]\', // 输出文件名称
limit: 1024, // 小于limit则转为base64
esModule: false, // 禁用esModule, 解决html中img标签的src不正确的问题
publicPath: \'http://example.com/\' // 项目线上的地址,这里建议用绝对地址,相对地址会在html文件目录结构复杂时出现图片路径问题, 本地开发为http://localhost:8080/
}
}
]
}
【html中的图片】:对于HtmlWebpackPlugin插件生成的html文件,url-laoder不能直接处理img标签引用的图片,需要用html-laoder处理html文件
{
test: /\.html$/,
use: [
{
loader: \'html-loader\',
options: {
attrs: [\':data-src\', \'img:src\'], // 处理所有data-src属性对应的图片,img标签的src属性对应图片
interpolate: \'require\' // 启用插值语法,html模版中可以使用require来引入图片,html组件等等
}
}
]
}
提取css文件
css文件默认是打包在js文件内的,建议提取css文件,从head标签引入
plugins: [
new ExtractTextPlugin("build/[name].[hash:8].css")
]
本地开发
package.json
{
"scripts": {
"dev": "webpack-dev-server"
}
}
npm run dev
默认端口为8080,访问:http://localhost:8080
生产打包
package.json
{
"scripts": {
"build": "webpack"
}
}
npm run build
完整webpack.config.js
// webpack.config.js
var path = require(\'path\')
var HtmlWebpackPlugin = require(\'html-webpack-plugin\');
var CopyWebpackPlugin = require(\'copy-webpack-plugin\');
var ExtractTextPlugin = require("extract-text-webpack-plugin");
module.exports = {
entry: {
index: "./entry/index.js",
teacher: "./entry/teacher.js",
item: "./entry/item.js",
},
output: {
path: path.join(__dirname, \'./dist\'),
filename: "build/[name].[hash:8].js"
},
module: {
rules: [
{
test: /\.html$/,
use: [
{
loader: \'html-loader\',
options: {
attrs: [\':data-src\', \'img:src\'], // 处理所有data-src属性对应的图片,img标签的src属性对应图片
interpolate: \'require\' // 启用插值语法,html模版中可以使用require来引入图片,html组件等等
}
}
]
},
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: "style-loader",
use: "css-loader"
})
},
{
test: /\.(gif|jpg|png|woff|svg|eot|ttf)\??.*$/,
use: [
{
loader: \'url-loader\',
options: {
name: \'img/[name].[hash:8].[ext]\', // 输出文件名称
limit: 1024, // 小于limit则转为base64
esModule: false, // 禁用esModule, 解决html中img标签的src不正确的问题
publicPath: \'http://example.com/\' // 项目线上的地址,这里建议用绝对地址,相对地址会在html文件目录结构复杂时出现图片路径问题, 本地开发为http://localhost:8080/
}
}
]
}
]
},
optimization: {
splitChunks: {
chunks: \'all\',
cacheGroups: {
common: {
name: \'common\',
minChunks: 2, //最少被2个chunk引用
}
}
}
},
plugins: [
new HtmlWebpackPlugin({
chunks: [\'index\', \'common\'],
template: \'./src/index.html\',
filename: \'index.html\'
}),
new HtmlWebpackPlugin({
chunks: [\'list\', \'common\'],
template: \'./src/list.html\',
filename: \'list.html\'
}),
new HtmlWebpackPlugin({
chunks: [\'item\', \'common\'],
template: \'./src/item1.html\',
filename: \'item2.html\'
}),
new HtmlWebpackPlugin({
chunks: [\'item\', \'common\'],
template: \'./src/item2.html\',
filename: \'item2.html\'
}),
new CopyWebpackPlugin([
{
from: path.join(__dirname, \'./src/js\'),
to: path.join(__dirname, \'./dist/js\')
},
{
from: path.join(__dirname, \'./src/css\'),
to: path.join(__dirname, \'./dist/css\')
}
]),
new ExtractTextPlugin("build/[name].[hash:8].css")
]
};