详解webpack+ES6+Sass搭建多页面应用
作者:路陆 发布时间:2024-07-28 05:03:47
webpack同之前的gulp相比,gulp属于非模块化打包工具,webpack属于模块化打包工具,两者的优劣这里不做过多分析(可自行百度)。
目的:是为了分享一下使用过程中,用到的插件、loader、遇到的各种问题以及解决办法,最后会附上最终代码。
在这个项目中,用 webpack打包css、scss、js、图片文件、jquery、第三方插件、字体图标,编译es6、压缩html、压缩js、压缩css ,基本涵盖了常用的东西。
代码结构如下
下面单独说几个难点
1、打包多页面,使用到的插件是html-wepack-plugin , html-loader ,也就是你有多少个页面,就有多少个入口,也就写多少个模版文件。当然,页面过多时,可以考虑遍历处理。
//引入路径插件
const path = require('path');
//引入导出html插件
const HtmlWebpackPlugin = require('html-webpack-plugin');
const config = {
//入口
entry:{
home:'./pages/lawSearchHomepage.js',
list:'./pages/lawSearchList.js'
},
//出口
output:{
filename: '[name].bundle.js',
path: path.resolve(__dirname,'build')
},
//插件
plugins: [
//html单独导出插件——首页
new HtmlWebpackPlugin({
filename:'lawSearchHomepage.html',//输出后的文件名称
template:'./pages/lawSearchHomepage.html',//模版页面路径
favicon:'./pages/images/favicon.ico',//页签图标
chunks:['home'],//需要引入的js文件名称
inject: true,
hash:true,//哈希值
minify: {//压缩
removeComments: true,
collapseWhitespace: true
}
}),
//html单独导出插件——列表页
new HtmlWebpackPlugin({
filename:'lawSearchList.html',
template:'./pages/lawSearchList.html',
favicon:'./pages/images/favicon.ico',
chunks:['list'],
inject: true,
hash:true,
minify: {
removeComments: true,
collapseWhitespace: true
}
})
]
}
module.exports = config;
2、单独打包css,使用到的插件extract-text-webpack-plugin ,loader有style-loader、css-loader、sass-loader、node-sass,因为每个页面要引入相对应的css文件,所以,在js入口文件里通过require('./lawSearchHomepage.scss')引如对应的scss文件,打包后css文件会单独打包,并通过link的形式引入html
//引入导出css插件
const ExtractTextPlugin = require('extract-text-webpack-plugin');
//loader
{//CSS
test:/\.css/,
use:ExtractTextPlugin.extract({
use:['css-loader']
})
},
{//Sass
test:/\.scss/,
use:ExtractTextPlugin.extract({
fallback:"style-loader",
use:['css-loader','sass-loader']
},)
}
//plugins
//将css单独打包插件
new ExtractTextPlugin({
filename:"[name].css",//制定编译后的文件名称
allChunks:true,//把分割的块分别打包
}),
3、处理es6,安 * abel、babel-loader@7(因为下面压缩js,其他版本报错)、babel-core、babel-preset-es2015(也是为了解决压缩js报错)
//loader
{//ES6
test:/\.js$/,
loader:'babel-loader',
// exclude:__dirname+'node_modules',//不对这个进行babel转换,这里边已经打包好,这样能减少打包时间
// include:__dirname+'src'这里的src是你要编译的js文件的目录,
exclude:path.resolve(__dirname,'node_modules'),
include:path.resolve(__dirname,'pages'),
query:{//若在package.json中定义了这个presets,则这边可以删掉
presets:['es2015']
}
},
4、处理jquery,安装expose-loader
第一种方法可以通过在js里require('expose-loader?$!jquery');引入jquery
第二种通过loader
//loader
{//Jquery
test: require.resolve('jquery'),
use: [{
loader: 'expose-loader',
options: 'jQuery'
},{
loader: 'expose-loader',
options: '$'
}]
},
5、压缩css,使用插件optimize-css-assets-webpack-plugin,安装cssnano
//引入压缩css的插件
const optimizeCss = require('optimize-css-assets-webpack-plugin');
//引入cssnano插件
const cssnano = require('cssnano');
//plugins
plugins:[
new optimizeCss({
assetNameRegExp: /\.style\.css$/g,
cssProcessor: cssnano,
cssProcessorOptions: { discardComments: { removeAll:
true } },
canPrint: true
}),
],
//压缩优化css,不写这个css还是没压缩,不知道为啥
optimization: {
// minimize: true,
minimizer: [new optimizeCss({})]
},
6、压缩js,一般的情况下,js默认就是压缩状态,但是在压缩完css后,js就不是压缩的了,所以还是处理一下,编译更快
用的插件uglifyjs-webpack-plugin
//引入js压缩插件
const uglifyjs = require('uglifyjs-webpack-plugin');
//plugins
new uglifyJs()
我的package.json中安装的插件
"devDependencies": {
"babel": "^6.23.0",
"babel-core": "^6.26.3",
"babel-loader": "^7.1.5",
"babel-preset-es2015": "^6.24.1",
"clean-webpack-plugin": "^0.1.19",
"css-loader": "^1.0.0",
"cssnano": "^4.1.7",
"expose-loader": "^0.7.5",
"extract-text-webpack-plugin": "^4.0.0-beta.0",
"file-loader": "^2.0.0",
"font-awesome-webpack": "^0.0.5-beta.2",
"html-loader": "^0.5.5",
"html-webpack-plugin": "^3.2.0",
"jquery": "^3.3.1",
"node-sass": "^4.9.4",
"optimize-css-assets-webpack-plugin": "^5.0.1",
"postcss-loader": "^3.0.0",
"sass-loader": "^7.1.0",
"style-loader": "^0.23.1",
"typeahead.js": "^0.11.1",
"uglifyjs-webpack-plugin": "^2.0.1",
"url-loader": "^1.1.2",
"webpack": "^4.23.1",
"webpack-cli": "^3.1.2",
"webpack-dev-server": "^3.1.10"
}
webpack.config.js里的代码(完整版)
//引入路径插件
const path = require('path');
//引入导出html插件
const HtmlWebpackPlugin = require('html-webpack-plugin');
//引入清除插件
const CleanWebpackPlugin = require('clean-webpack-plugin');
//引入导出css插件
const ExtractTextPlugin = require('extract-text-webpack-plugin');
//引入webpack
const webpack = require('webpack');
//引入压缩css的插件
const optimizeCss = require('optimize-css-assets-webpack-plugin');
//引入cssnano插件
const cssnano = require('cssnano');
//引入js压缩插件
const uglifyjs = require('uglifyjs-webpack-plugin');
//webpack配置内容
const config = {
//入口
entry:{
home:'./pages/lawSearchHomepage.js',
list:'./pages/lawSearchList.js'
},
//便于调试
devtool:'inline-source-map',
//服务
devServer:{
contentBase:'./build/lawSearchHomepage.html'
},
//loader模块
module:{
rules: [
{//ES6
test:/\.js$/,
loader:'babel-loader',
// exclude:__dirname+'node_modules',//不对这个进行babel转换,这里边已经打包好,这样能减少打包时间
// include:__dirname+'src'这里的src是你要编译的js文件的目录,
exclude:path.resolve(__dirname,'node_modules'),
include:path.resolve(__dirname,'pages'),
query:{//若在package.json中定义了这个presets,则这边可以删掉
presets:['es2015']
}
},
{//Jquery
test: require.resolve('jquery'),
use: [{
loader: 'expose-loader',
options: 'jQuery'
},{
loader: 'expose-loader',
options: '$'
}]
},
{//CSS
test:/\.css/,
use:ExtractTextPlugin.extract({
use:['css-loader']
})
},
{//Sass
test:/\.scss/,
use:ExtractTextPlugin.extract({
fallback:"style-loader",
use:['css-loader','sass-loader']
},)
},
{//处理模块html
test: /\.html$/,
use: 'html-loader'
},
{//图片
test: /\.(jpg|png|gif)$/,
use: {
loader: 'file-loader',
options: {
outputPath: 'images'
}
}
},
//字体图标
{
test: /\.(eot|svg|ttf|woff|woff2)\w*/,
loader: 'file-loader'
}
]
},
//插件
plugins: [
//清空build文件下的多余文件
new CleanWebpackPlugin(['build']),
//将css单独打包插件
new ExtractTextPlugin({
filename:"[name].css",//制定编译后的文件名称
allChunks:true,//把分割的块分别打包
}),
//html单独导出插件——首页
new HtmlWebpackPlugin({
filename:'lawSearchHomepage.html',//输出后的文件名称
template:'./pages/lawSearchHomepage.html',//模版页面路径
favicon:'./pages/images/favicon.ico',//页签图标
chunks:['home'],//需要引入的js文件名称
inject: true,
hash:true,//哈希值
minify: {//压缩
removeComments: true,
collapseWhitespace: true
}
}),
//html单独导出插件——列表页
new HtmlWebpackPlugin({
filename:'lawSearchList.html',
template:'./pages/lawSearchList.html',
favicon:'./pages/images/favicon.ico',
chunks:['list'],
inject: true,
hash:true,
minify: {
removeComments: true,
collapseWhitespace: true
}
}),
//压缩css
new optimizeCss({
assetNameRegExp: /\.style\.css$/g,
cssProcessor: cssnano,
cssProcessorOptions: { discardComments: { removeAll: true } },
canPrint: true
}),
//压缩js
new uglifyjs()
],
//压缩优化css
optimization: {
// minimize: true,
minimizer: [new optimizeCss({})]
},
//出口
output:{
filename: '[name].bundle.js',
path: path.resolve(__dirname,'build')
}
}
module.exports = config;
如果在打包过程中报模块没有定义错误,那就再安装一次,实在不行,直接删了node_modules文件,重新npm install一下。
来源:http://www.cnblogs.com/hess/p/9896197.html


猜你喜欢
- EXEC SQL WHENEVER SQLERROR CONTINUE; sqlglm(msg_buffer, &buf
- Q: I am working with Oracle database 8.1.7 and I have written a JAVA c
- 前言日常开发使用到的命令行工具大都支持如下特性:文档自动生成(如 -h --help)多级子命令(如 docker exec -it)支持参
- 计算字符串中所有数字的和,字符串中有数字和字母组合而成如果出现连续数字,按照一个数操作具体解释在代码行里:def sum_str(str1)
- 使用ewebeditor作为后台编辑器时,尤其是一个页面中使用多次该编辑器时,在提交数据时,可能会遇到数据被重复提交的情况。搜索找来一些解决
- 我就废话不多说了,直接上代码吧!import paramikoimport pymysqlimport timelinux = ['
- 一、查找操作1.Excel 模块 xlrd,xlwt,xlutils 分别负责 Excel 文件的读、写、读写转换工作!2.openpyxl
- 关于python中的二维数组,主要有list和numpy.array两种。好吧,其实还有matrices,但它必须是2维的,而numpy a
- 图像的全景拼接包括三大部分:特征点提取与匹配、图像配准、图像融合。1、基于SIFT的特征点的提取与匹配利用Sift提取图像的局部特征,在尺度
- 1. 使用 easy_installeasy_install 这应该是最古老的包安装方式了,目前基本没有人使用了。下面是 easy_inst
- 一、爬山法简介爬山法(climbing method)是一种优化算法,其一般从一个随机的解开始,然后逐步找到一个最优解(局部最优)。 假定所
- 写程序必然需要版本控制,哪怕是个人项目也是必须的,VS2015开始默认提供了对Git的支持。考虑到现在Git很火,作为微软系的程序员也不得不
- 创建自定义编辑器: //引入editor_config.js,editor_api.js,ueditor.css文件,然后在body中创建编
- 遍历pd.Series的index和value的方法如下,python built-in list的enumerate方法不管用for i,
- 使用filter函数,实现一个条件判断函数即可。比如想过滤掉字符串数组中某个敏感词,示范代码如下:#filter out some unwa
- 1、路径https://www.lfd.uci.edu/~gohlke/pythonlibs/PS:网上说有时候报404,解决办法是换浏览器
- 前言前段时间,因为项目需求,需要根据关键词搜索聊天记录,这不就是一个搜索引擎的功能吗?于是我第一时间想到的就是 ElasticSearch
- 1. requests发送文件功能Requests 使得上传多部分编码文件变得很简单url = 'http://httpbin.or
- 本文将演示如何使用SQL 7.0服务器的Enterprise Manager创建、配置一个示例数据库。我们还会演示如何增加具有合适权限的用户
- 本文实例讲述了Python爬取需要登录的网站实现方法。分享给大家供大家参考,具体如下:import requestsfrom lxml im