基于 webpack2 实现的多入口项目脚手架详解
发布时间 - 2026-01-11 02:03:29 点击率:次简介

基于 webpack2 实现的多入口项目脚手架,主要使用 extract-text-webpack-plugin 实现 js 、css 公共代码提取,html-webpack-plugin 实现 html 多入口,less-loader 实现 less 编译,postcss-loader 配置 autoprefixer 实现自动添加浏览器兼容前缀,html-withimg-loader 实现 html 内引入图片版本号添加和模板功能,babel-loader 实现 ES6 转码功能, happypack 多线程加速构建速度。
目录
├── dist # 构建后的目录 ├── config # 项目配置文件 │ ├── webpack.config.js # webpack 配置文件 │ └── postcss.config.js # postcss 配置文件 ├── src # 程序源文件 │ └── js # 入口 │ ├ └── index.js # 匹配 view/index.html │ ├ └── user │ ├ ├ ├── index.js # 匹配 view/user/index.html │ ├ ├ ├── list.js # 匹配 view/user/list.html │ ├ └── lib # JS 库等,不参与路由匹配 │ ├ ├── jquery.js │ └── view │ ├ └── index.html # 对应 js/index.js │ ├ └── user │ ├ ├── index.html # 对应 js/user/index.js │ ├ ├── list.html # 对应 js/user/list.js │ └── css # css 文件目录 │ ├ └── base.css │ ├ └── iconfont.css │ └── font # iconfont 文件目录 │ ├ └── iconfont.ttf │ ├ └── iconfont.css │ └── img # 图片文件目录 │ ├ └── pic1.jpg │ ├ └── pic2.png │ └── template # html 模板目录 │ └── head.html │ └── foot.html
配置
多入口
根据 JS 目录获取多入口数组
const ROOT = process.cwd(); // 根目录
let entryJs = getEntry('./src/js/**/*.js');
/**
* 根据目录获取入口
* @param {[type]} globPath [description]
* @return {[type]} [description]
*/
function getEntry (globPath) {
let entries = {};
Glob.sync(globPath).forEach(function (entry) {
let basename = path.basename(entry, path.extname(entry)),
pathname = path.dirname(entry);
// js/lib/*.js 不作为入口
if (!entry.match(/\/js\/lib\//)) {
entries[pathname.split('/').splice(3).join('/') + '/' + basename] = pathname + '/' + basename;
}
});
return entries;
}
// webpack 配置
const config = {
entry: entryJs,
output: {
filename: 'js/[name].js?[chunkhash:8]',
chunkFilename: 'js/[name].js?[chunkhash:8]',
path: path.resolve(ROOT, 'dist'),
publicPath: '/'
},
}
module
使用 babel 实现 ES2015 转 ES5,less 转 css 并使用 postcss 实现 autoprefixer 自动添加浏览器兼容,url-loader 实现 css 引用图片、字体添加版本号,html-withimg-loader 实现 html 引用图片添加版本号并实现模板功能。
module: {
rules: [
{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader?id=js',
options: {
presets: ['env']
}
}
},
{
test: /\.(less|css)$/,
use: ExtractTextPlugin.extract({
fallback: 'style-loader?id=styles',
use: [{
loader: 'css-loader?id=styles',
options: {
minimize: !IsDev
}
},
{
loader: 'less-loader?id=styles'
},
{
loader: 'postcss-loader?id=styles',
options: {
config: {
path: PostcssConfigPath
}
}
}
]
})
},
{
test: /\.(png|jpg|gif)$/,
use: [
{
loader: 'url-loader',
options: {
limit: 100,
publicPath: '',
name: '/img/[name].[ext]?[hash:8]'
}
}
]
},
{
test: /\.(eot|svg|ttf|woff)$/,
use: [
{
loader: 'url-loader',
options: {
limit: 100,
publicPath: '',
name: '/font/[name].[ext]?[hash:8]'
}
}
]
},
// @see https://github.com/wzsxyz/html-withimg-loader
{
test: /\.(htm|html)$/i,
loader: 'html-withimg-loader?min=false'
}
]
},
// postcss.config.js
module.exports = {
plugins: [
require('autoprefixer')({
browsers: ['> 1%', 'last 5 versions', 'not ie <= 9'],
})
]
}
View 视图
根据目录对应关系,获取 js 对应的 html 入口
let entryHtml = getEntryHtml('./src/view/**/*.html'),
configPlugins;
entryHtml.forEach(function (v) {
configPlugins.push(new HtmlWebpackPlugin(v));
});
// webpack 配置
resolve: {
alias: {
views: path.resolve(ROOT, './src/view')
}
},
/**
* 根据目录获取 Html 入口
* @param {[type]} globPath [description]
* @return {[type]} [description]
*/
function getEntryHtml (globPath) {
let entries = [];
Glob.sync(globPath).forEach(function (entry) {
let basename = path.basename(entry, path.extname(entry)),
pathname = path.dirname(entry),
// @see https://github.com/kangax/html-minifier#options-quick-reference
minifyConfig = IsDev ? '' : {
removeComments: true,
collapseWhitespace: true,
minifyCSS: true,
minifyJS: true
};
entries.push({
filename: entry.split('/').splice(2).join('/'),
template: entry,
chunks: ['common', pathname.split('/').splice(3).join('/') + '/' + basename],
minify: minifyConfig
});
});
return entries;
}
plugins
使用 happypack 多线程加快构建速度,CommonsChunkPlugin 实现提取公用 js 为单独文件,extract-text-webpack-plugin 实现提取公用 css 为单独文件,
let configPlugins = [
new HappyPack({
id: 'js',
// @see https://github.com/amireh/happypack
threadPool: HappyThreadPool,
loaders: ['babel-loader']
}),
new HappyPack({
id: 'styles',
threadPool: HappyThreadPool,
loaders: ['style-loader', 'css-loader', 'less-loader', 'postcss-loader']
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'common'
}),
// @see https://github.com/webpack/webpack/tree/master/examples/multiple-entry-points-commons-chunk-css-bundle
new ExtractTextPlugin({
filename: 'css/[name].css?[contenthash:8]',
allChunks: true
})
];
entryHtml.forEach(function (v) {
configPlugins.push(new HtmlWebpackPlugin(v));
});
// webpack 配置
plugins: configPlugins,
开发
webpack-dev-server 实现开发环境自动刷新等功能
// webpack 配置
devServer: {
contentBase: [
path.join(ROOT, 'src/')
],
hot: false,
host: '0.0.0.0',
port: 8080
}
开发
npm start
http://localhost:8080/view
构建
cross-env 实现区分开发和生产环境构建
命令 说明
npm run dev 开发环境构建,不压缩代码
npm run build 生产环境构建,压缩代码
仓库:https://github.com/givebest/webpack2-multiple-entry
本地下载:http://xiazai./201706/yuanma/webpack2-multiple-entry().rar
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# webpack2
# 脚手架
# webpack脚手架
# webpack
# 多入口配置
# 详解webpack 多入口配置
# webpack多入口文件页面打包配置详解
# 配置文件
# 多线程
# 本地下载
# 这篇文章
# 等功能
# 谢谢大家
# 有疑问
# Glob
# sync
# return
# function
# entries
# path
# extname
# basename
# forEach
# entry
# description
# ROOT
# process
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
音响网站制作视频教程,隆霸音响官方网站?
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
jQuery validate插件功能与用法详解
如何在IIS中新建站点并配置端口与物理路径?
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
如何快速使用云服务器搭建个人网站?
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
javascript中闭包概念与用法深入理解
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
如何用y主机助手快速搭建网站?
郑州企业网站制作公司,郑州招聘网站有哪些?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
Laravel Session怎么存储_Laravel Session驱动配置详解
如何为不同团队 ID 动态生成多个“认领值班”按钮
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
Laravel定时任务怎么设置_Laravel Crontab调度器配置
高端建站三要素:定制模板、企业官网与响应式设计优化
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
成都网站制作公司哪家好,四川省职工服务网是做什么用?
如何做网站制作流程,*游戏网站怎么搭建?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集
javascript基本数据类型及类型检测常用方法小结
如何在万网利用已有域名快速建站?
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
Laravel如何实现用户密码重置功能?(完整流程代码)
怎么用AI帮你为初创公司进行市场定位分析?
如何在Tomcat中配置并部署网站项目?
LinuxCD持续部署教程_自动发布与回滚机制
Laravel如何配置Horizon来管理队列?(安装和使用)
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
QQ浏览器网页版登录入口 个人中心在线进入
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
如何在阿里云高效完成企业建站全流程?
Laravel如何使用withoutEvents方法临时禁用模型事件
原生JS实现图片轮播切换效果
详解jQuery中基本的动画方法
如何在阿里云域名上完成建站全流程?
如何在不使用负向后查找的情况下匹配特定条件前的换行符
如何在Ubuntu系统下快速搭建WordPress个人网站?
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
html5audio标签播放结束怎么触发事件_onended回调方法【教程】

