webpack打包多html传统项目
生成package.json文件
npm init -y
全局安装webpack
cnpm install webpack -g
项目中安装,生成node_modules依赖
cnpm install webpack --save-dev
cnpm install webpack-cli --save-dev
配置webpack.config.js
打包html需要使用插件
cnpm install html-webpack-plugin --save-dev//页面打包
cnpm install html-withimg-loader --save-dev//打包html中img引入的图片
cnpm install uglifyjs-webpack-plugin --save-dev 打包js插件并压缩
cnpm install clean-webpack-plugin --save-dev//清除dist中的文件
cnpm install extract-text-webpack-plugin@next //抽离出来一个独立的css文件
cnpm install copy-webpack-plugin --save-dev//拷贝文件
cnpm install style-loader --save-dev//打包样式
cnpm install optimize-css-assets-webpack-plugin --save-dev
cnpm install css-loader --save-dev //处理 import / require() @import / url 引入的内容
cnpm install file-loader --save-dev//打包图片文件
cnpm install image-webpack-loader --save-dev // 压缩图片
页面插件
cnpm install jquery --save-dev
cnpm install swiper --save-dev
编译
webpack -p 或者 npx webpack 或者webpack
别人git项目以后 执行一下命令:
npm install 或者cnpm i 淘宝镜像会快点
package.json
{
"name": "caicai",
"version": "1.0.0",
"description": "官网",
"main": "index.js",
"scripts": { },
"repository": {},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"clean-webpack-plugin": "^3.0.0",
"copy-webpack-plugin": "^5.1.1",
"css-loader": "^3.5.2",
"extract-text-webpack-plugin": "^4.0.0-beta.0",
"file-loader": "^6.0.0",
"html-webpack-plugin": "^4.2.0",
"html-withimg-loader": "^0.1.16",
"image-webpack-loader": "^6.0.0",
"jquery": "^3.5.0",
"optimize-css-assets-webpack-plugin": "^5.0.3",
"style-loader": "^1.1.3",
"swiper": "^5.3.7",
"uglifyjs-webpack-plugin": "^2.2.0",
"webpack": "^4.42.1",
"webpack-cli": "^3.3.11"
},
"config": {}
}
webpack.config.js
/**
* 引入打包所需脚本
*/
var webpack = require('webpack');
var path = require('path');
// 读取文件
var fs = require("fs");
// 根目录查找html
var pathName = "./";
// 存放所有html名称的集合
var htmlFiles = []
// 匹配html文件
var ipReg = /\.(htm|html)$/i;
// 找到根目录的所有html 除index之外 存在htmlFiles中
fs.readdirSync(pathName).forEach(files=>{
if(ipReg.test(files) && files.indexOf('index') < 0){
htmlFiles.push(files)
}
});
// 将所有页面合并到plugins
function html_plugins() {
var r = []
for (var i=0;i<htmlFiles.length;i++){
var conf={
favicon: './favicon.ico', //生成html文件的favicon的路径
chunks: ['js/bundle','libs/aos'], // 所有子页面都调用这些 不写chunks的话,就是所有js都调用,可以和index写在一起,然后就不用了分开写,然后还判断了
filename: htmlFiles[i],
template: htmlFiles[i],
minify: false
};
r.push(new HtmlWebpackPlugin(conf));
}
return r
}
// 打包html的插件
var HtmlWebpackPlugin = require('html-webpack-plugin');
// 打包js插件
var uglify = require('uglifyjs-webpack-plugin');
// 用于在构建前清除dist目录中的内容
var { CleanWebpackPlugin } = require('clean-webpack-plugin');
// 单独打包样式
var ExtractTextPlugin = require('extract-text-webpack-plugin');
// 压缩css文件
var OptimizeCssplugin = require('optimize-css-assets-webpack-plugin');
// 拷贝文件
var CopyWebpackPlugin = require('copy-webpack-plugin');
/**
* 打包配置项
*/
module.exports = {
// 和不在source显示webpack一起配置
devtool: false,
entry: {
//打包成多个是为了解决加载顺序导致的bug
'libs/aos':'./libs/aos/aos.js',// 所有页面调用aos执行动画
'libs/three.min':'./js/three.min.js',// 只有首页用到了three
bundle: [// 所有页都用这个
// 要打包的css样式
'./js/css.js',
'./libs/jquery/jquery.nicescroll.min.js',
'./libs/layui/layui.all.js',
'./js/index.js',
'./js/common.js',
'./js/nav.js'
]
},
output: {
// 这个[name]的意思是,配置入口entry键值对里的key值,app/dist/js/index,最后的index,
filename: '[name].js',
//__dirname 当前webpack.config.js的路径
path: path.resolve(__dirname, './dist'),
},
mode: 'development', // 开发模式设置为development,发布时改为production
module: {
rules: [
// 样式单独打包
{
test: /\.css/,
//ExtractTextPlugin插件的作用是为了不让css被打包到了js文件中,不然浏览器打开index.html,就会发现css以style的形式被插到了head
loader: ExtractTextPlugin.extract({
fallback: "style-loader",
use: "css-loader"
})
},
{
// 图片
test: /\.(png|jpg|gif|svg|webm)$/i,
use:[
{
loader: 'file-loader',
options: {
// 保持图片名不变,而且也能够添加到指定目录下
name: 'images/[name][hash:8].[ext]',
publicPath: './',
esModule: false
// outputPath: './',
}
},
'image-webpack-loader',//压缩图片
]
},
{
// 页面
test: /\.(htm|html)$/i,
loader:'html-withimg-loader'
}
]
},
// 插件
plugins: [
// 防止源文件内容包含在源映射中
new webpack.SourceMapDevToolPlugin({ noSources: false }),
// 打包成单独css
new ExtractTextPlugin({
filename:'css/bundle.css',
}),
// 压缩 css 文件
new OptimizeCssplugin(),
// 拷贝文件插件
new CopyWebpackPlugin([{
from: path.resolve(__dirname, 'images/banner.webm'),
to: path.resolve(__dirname, 'dist/images/banner.webm')
}]),
// 全局js
new webpack.ProvidePlugin({
$: "jquery",
jQuery: "jquery",
"window.jQuery": "jquery",//Angular 会寻找 window.jQuery 来决定 jQuery 是否存在
Swiper: ['swiper', 'default']// 这个全局定义 就类似vue一样的定义,这样能解决报Swiper未定义的bug
}),
// 压缩js代码 这个方法可以不调用了,因为webpack4已经内置了
// new uglify(),
// 清除dist构建目录文件
new CleanWebpackPlugin(),
// html页面,可多个
new HtmlWebpackPlugin({
title: '123', //生成html文件的标题
favicon: './favicon.ico', //生成html文件的favicon的路径
// chunks: ['bundle','libs/aos'],
filename: 'project/index.html',
template: 'project/index.html',
minify: false//false 就是不使用html压缩
/*minify: {
removeComment: true,
collapseWhitespace: true,
removeEmptyAttributes:true
}*/
})
].concat(html_plugins())
}
常见报错信息:
1、Unexpected string // 少了逗号,代码不规范
2、Unexpected identifier// 少了逗号,代码不规范
3、一大片报错信息的话,那就是少安装了依赖,仔细阅读错误代码,一般错误代码第二行或者第三行,就能看到依赖的名称
然后cnpm install 名称 --save-dev
4、cnpm不成功就是你没有安装淘宝镜像,用npm也行
5、安装淘宝镜像:npm install -g cnpm --registry=https://registry.npm.taobao.org
6、如果img报错那就是图片不存在
有疑问可以问我
我这个要是有什么bug 也可以提醒我,谢谢。欢迎指教
我们的目录结构