webpack集成bootstrap进行多页面开发

这篇文章已经过时了,有兴趣的可以看看github上示例工程,其基本思想还是一致的:

https://github.com/luqingxuan/JqueryPagesExample

 

webpack还是很有搞头的,再搞搞gulp都不用了。。。

最近以jquery、bootstrap为例,搞了个多页面,多入口开发结构,mark一下。

 

开发人员主要集中在以上三个目录,整理js/css/img/page

最终通过webpack打包到dist目录,打出目录结构




 
 

 

因为使用extract-text-webpack-plugin插件,提取css文件名,这个坑爹有点,后续通过改造这个插件,可以单独打出来css文件夹,实践过,又忘了。。。。

ok,上webpack.config.js

var path = require('path');

var glob = require('glob');

var webpack = require('webpack');

var ExtractTextPlugin = require("extract-text-webpack-plugin");

var CommonsChunkPlugin = require("webpack/lib/optimize/CommonsChunkPlugin");

// CSS浏览器前缀问题
var autoprefixer = require('autoprefixer');
var precss = require('precss');

// 多入口文件
function getEntrys() {

	var entrys = {};

	var src = new RegExp(__dirname.replace(/\\/g, "/") + "/src/");

	glob.sync(__dirname + '/src/js/**/*.js').forEach(function(name) {

		// 前缀
		var entry = name.replace(src, "");

		// 后缀
		entry = entry.replace(/\.js$/, "");

		entrys[entry] = name;

	});

	return entrys;
};

module.exports = {
	context : __dirname + '/src',
	entry : getEntrys(),
	output : {
		path : path.resolve(__dirname, './dist'),
		publicPath : '/dist/',
		filename : '[name].js'
	},
	resolveLoader : {
		root : path.join(__dirname, 'node_modules')
	},
	resolve : {
		root : path.join(__dirname, 'node_modules'),
		extensions : [ '', '.js' ],
		alias : {}
	},
	plugins : [
	// 全局依赖jQuery
	new webpack.ProvidePlugin({
		$ : "jquery",
		jQuery : "jquery",
		"window.jQuery" : "jquery"
	}),
	// 提取依赖的jQuery通用插件
	new CommonsChunkPlugin({
		name : "js/vendor",
		minChunks : Infinity
	}),
	// 提取CSS文件
	new ExtractTextPlugin("[name].css"),
	// 查找相等或近似的模块,避免在最终生成的文件中出现重复的模块
	new webpack.optimize.DedupePlugin() ],
	module : {
		loaders : [
				{
					test : /\.js$/,
					loader : 'babel',
					exclude : /node_modules/
				},
				{
					test : /\.jsx$/,
					loader : 'babel',
					exclude : /node_modules/
				},
				{
					test : /\.json$/,
					loader : 'json'
				},
				{
					test : /\.(png|jpg|gif)$/,
					loader : 'url',
					query : {
						limit : 10000,
						// CSS图片目录
						name : '[path][name]_[hash].[ext]'
					}
				},
				{
					test : /\.less$/,
					loader : ExtractTextPlugin.extract("style-loader",
							"css-loader!postcss-loader")
				},
				{
					test : /\.css$/,
					loader : 'style!css',
					loader : ExtractTextPlugin.extract("style-loader",
							"css-loader!postcss-loader")
				}, {// bootstrap font-awesome
					test : /\.(woff|woff2)(\?v=\d+\.\d+\.\d+)?$/,
					loader : 'url',
					query : {
						limit : 10000,
						mimetype : 'application/font-woff',
						// 字体文件放置目录
						name : 'font/bootstrap/[name]_[hash].[ext]'
					}
				}, {// bootstrap
					test : /\.ttf(\?v=\d+\.\d+\.\d+)?$/,
					loader : 'url',
					query : {
						limit : 10000,
						mimetype : 'application/octet-stream',
						// 字体文件放置目录
						name : 'font/bootstrap/[name]_[hash].[ext]'
					}
				}, {// bootstrap
					test : /\.eot(\?v=\d+\.\d+\.\d+)?$/,
					loader : 'file',
					query : {
						limit : 10000,
						// 字体文件放置目录
						name : 'font/bootstrap/[name]_[hash].[ext]'
					}
				}, {// bootstrap
					test : /\.svg(\?v=\d+\.\d+\.\d+)?$/,
					loader : 'url',
					query : {
						limit : 10000,
						mimetype : 'application/image/svg+xml',
						// 字体文件放置目录
						name : 'font/bootstrap/[name]_[hash].[ext]'
					}
				}, {// font-awesome
					test : /\.(ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
					loader : "file",
					query : {
						limit : 10000,
						// 字体文件放置目录
						name : 'font/bootstrap/[name]_[hash].[ext]'
					}
				}, {// 如果要加载jQuery插件,解析路径&参数
					test : "/lib/jquery/**/*.js$",
					loader : "'imports?jQuery=jquery,$=jquery,this=>window"
				} ]
	},
	postcss : function() {
		return [ autoprefixer({
			browsers : [ 'not ie <= 8' ]
		}), precss ];
	},
	devServer : {
		historyApiFallback : true,
		noInfo : true,
		// 其实很简单的,只要配置这个参数就可以了
		proxy : {
			'/v1/*' : {
				target : 'http://localhost:3000/',
				secure : false
			}
		}
	},
	devtool : 'eval-source-map'
}

if (process.env.NODE_ENV === 'production') {
	module.exports.devtool = 'source-map'
	// http://vuejs.github.io/vue-loader/workflow/production.html
	module.exports.plugins = (module.exports.plugins || []).concat([
			new webpack.DefinePlugin({
				'process.env' : {
					NODE_ENV : '"production"'
				}
			}), new webpack.optimize.UglifyJsPlugin({
				compress : {
					warnings : false
				}
			}), new webpack.optimize.OccurenceOrderPlugin() ])
}

 关于vendor.js、bootstrap.js的内容,以往记录过,就是个集合而已package.json也有,额外加了glob依赖。

 

现在面临如下几个问题:

1.css文件打包到dist目录没有形成单独的文件夹,受限于css提取插件,可改造实现

 

2.现在只有bootstrap、font-awesome字体文件,放到bootstrap文件夹了,其他字体文件呢,其实缺乏识别bootstrap、font-awesome的有效标识

 

3.dist目录下,除了js、css文件,其他文件都有hash值,还缺乏最后一步,将js、css文件hash处理,然后替换掉pages目录下的页面引用,这一步可以考虑gulp实现,在开发阶段,是不能直接hash js、css文件的,做了hash开发人员怎么办。。。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 webpack 来打包多个 HTML 页面。以下是一种常见的配置方法: 1. 首先,安装必要的 webpack 插件: ``` npm install html-webpack-plugin --save-dev ``` 2. 在 webpack.config.js 文件中配置多个页面: ```javascript const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: { page1: './src/page1.js', page2: './src/page2.js', }, output: { filename: '[name].bundle.js', path: path.resolve(__dirname, 'dist'), }, plugins: [ new HtmlWebpackPlugin({ filename: 'page1.html', template: './src/page1.html', chunks: ['page1'], }), new HtmlWebpackPlugin({ filename: 'page2.html', template: './src/page2.html', chunks: ['page2'], }), ], }; ``` 在上述示例中,我们配置了两个入口文件(page1.js 和 page2.js),分别对应两个 HTML 页面(page1.html 和 page2.html)。每个 HtmlWebpackPlugin 实例都指定了生成的 HTML 文件名称、模板文件路径以及关联的入口文件。 3. 创建对应的 HTML 模板文件: 在 src 目录下创建 page1.html 和 page2.html 文件,可以在这里编写对应页面的 HTML 结构。 4. 运行打包命令: ``` npx webpack ``` 运行以上命令后,webpack 将会根据配置生成多个 HTML 文件,并将对应的 JavaScript 文件注入到相应的 HTML 页面中。最终打包好的文件将存储在 dist 目录下。 这样,你就可以通过配置多个 HtmlWebpackPlugin 实例来打包多个 HTML 页面。每个 HTML 页面可以关联不同的入口文件,实现灵活的页面打包配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值