在上一篇中我们在html文件中也引用了一张图片,打包完毕后在浏览器控制台报错:

GET file:///D:/myweb/webpack/webpack_study_demo/webpack_new_test/dist/src/asserts/login1.png net::ERR_FILE_NOT_FOUND
// 意思是图片没找到,下面我们就来学习怎么处理HTML中的图片路径问题了

处理HTML中的图片路径问题

webpack处理资源无往不利,但有个问题总是很苦恼,html中直接使用img标签src加载图片的话,因为没有被依赖,图片将不会被打包。这个loader解决这个问题,图片会被打包,而且路径也处理妥当。额外提供html的include子页面功能。

安装

$ cnpm install html-withimg-loader --save

html-withimg-loader

// webpack.config.js
// 然后在生产环境下增加下列代码
config.module.rules.push({test: /\.(htm|html)$/i,loader: 'html-withimg-loader'})
$ npm run build
// 然后你就会发现上面的那个问题得到了解决,图片成功显示,被转为了base64格式写入了

css进阶: less文件的打包与处理

安装less服务

$ cnpm install less less-loader --save-dev
// webpack.config.js
var path = require('path');
var HtmlWebpackPlugin = require('html-webpack-plugin')
var webpack = require('webpack')
const isDev = process.env.NODE_ENV === 'development'
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); // 分离css
const uglify = require('uglifyjs-webpack-plugin');// js代码压缩插件const config = {entry: './src/index.js',output: {path: path.resolve(__dirname, 'dist'),filename: 'js/bundle.js'},module: {rules: [{test: /\.(jpg|png|svg|gif|jpeg)$/,use: [{loader: 'url-loader',options: {limit:500000,name: 'images/[name]-[hash].[ext]'}}]}]},plugins: [new HtmlWebpackPlugin({filename: 'index.html',template: 'index.html',inject: 'body'}),new webpack.HotModuleReplacementPlugin()]
}if (isDev) {// 开发环境下config.devServer = {host: 'localhost',    // 服务器的IP地址,可以使用IP也可以使用localhostcompress: true,    // 服务端压缩是否开启port: 3000, // 端口hot: true,open: true}config.module.rules.push({test: /\.css$/,use: ['style-loader', 'css-loader']},{                                // 【1】 在开发模式下处理,这里使用的依旧是style-loadertest: /\.less$/,use: ['style-loader', 'css-loader', 'less-loader'] })
} else {// 生产模式下config.plugins.push(new uglify())config.plugins.push(new MiniCssExtractPlugin({filename: "[name].css",chunkFilename: "[id].css"}))config.module.rules.push({test: /\.css$/,use: [ MiniCssExtractPlugin.loader, 'css-loader']},{test: /\.less$/,                    //【2】 在生产模式下,这里实现了less的分离use: [ MiniCssExtractPlugin.loader, 'css-loader','less-loader']})config.module.rules.push({test: /\.(htm|html)$/i,loader: 'html-withimg-loader'})
}module.exports = config;
$ npm run build
// 打包成功

css进阶 : SASS打包与处理

安装

$ cnpm install sass --save-dev

这里需要 在项目目录下用npm安装两个包。node-sasssass-loader
因为sass-loader依赖于node-sass,所以需要先安装node-sass

$ cnpm install sass-loader --save-dev
$ cnpm install node-sass@4.5.3 --save-dev
// sass.scss
$nav-color: #FFF;
#nav {$width: 100%;width: $width;height:30px;background-color: $nav-color;
}
// 与上面处理less是一样的做法
// webpack.config.js
var path = require('path');
var HtmlWebpackPlugin = require('html-webpack-plugin')
var webpack = require('webpack')
const isDev = process.env.NODE_ENV === 'development'
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); // 分离css
const uglify = require('uglifyjs-webpack-plugin');// js代码压缩插件const config = {entry: './src/index.js',output: {path: path.resolve(__dirname, 'dist'),filename: 'js/bundle.js'},module: {rules: [{test: /\.(jpg|png|svg|gif|jpeg)$/,use: [{loader: 'url-loader',options: {limit:500000,name: 'images/[name]-[hash].[ext]'}}]}]},plugins: [new HtmlWebpackPlugin({filename: 'index.html',template: 'index.html',inject: 'body'}),new webpack.HotModuleReplacementPlugin()]
}if (isDev) {// 开发环境下config.devServer = {host: 'localhost',    // 服务器的IP地址,可以使用IP也可以使用localhostcompress: true,    // 服务端压缩是否开启port: 3000, // 端口hot: true,open: true}config.module.rules.push({test: /\.css$/,use: ['style-loader', 'css-loader']},{test: /\.less$/,use: ['style-loader', 'css-loader', 'less-loader'] },{test: /\.scss$/,             // 【1】 use: ['style-loader', 'css-loader', 'sass-loader']})
} else {// 生产模式下config.plugins.push(new uglify())config.plugins.push(new MiniCssExtractPlugin({filename: "[name].css",chunkFilename: "[id].css"}))config.module.rules.push({test: /\.css$/,use: [ MiniCssExtractPlugin.loader, 'css-loader']},{test: /\.less$/,use: [ MiniCssExtractPlugin.loader, 'css-loader','less-loader']},{test: /\.scss$/,            // 【2】use: [ MiniCssExtractPlugin.loader, 'css-loader','sass-loader']})config.module.rules.push({test: /\.(htm|html)$/i,loader: 'html-withimg-loader'})
}module.exports = config;
// $ npm run build
// 没问题

处理css前缀

CSS3已经成了前端的必会技能,但是你一定为那些属性需要加前缀,以满足不同浏览器的兼容,这节课我们就学习一下如何通过postcss-loadercss3属性自动添加前缀。

为了浏览器的兼容性,有时候我们必须加入-webkit,-ms,-o,-moz这些前缀。目的就是让我们写的页面在每个浏览器中都可以顺利运行。

postcss就是一个css的处理器,它有一项非常好的功能就是可以为css添加前缀,这将会使得我们的开发变得非常快速

安装

$  cnpm install --save-dev postcss-loader autoprefixer
// 以及其他插件
$  cnpm install postcss-import --save-dev
$  cnpm install postcss-cssnext --save-dev //一个模块化的缩小器,建立在PostCSS生态系统之上。看到的代码压缩间距就是这个插件的效果
// 样式编写,在每一个样式文件中都加这个
div{display: flex;
}
// webpack.config.js
var path = require('path');
var HtmlWebpackPlugin = require('html-webpack-plugin')
var webpack = require('webpack')
const isDev = process.env.NODE_ENV === 'development'
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); // 分离css
const uglify = require('uglifyjs-webpack-plugin');// js代码压缩插件const config = {entry: './src/index.js',output: {path: path.resolve(__dirname, 'dist'),filename: 'js/bundle.js'},module: {rules: [{test: /\.(jpg|png|svg|gif|jpeg)$/,use: [{loader: 'url-loader',options: {limit: 500000,name: 'images/[name]-[hash].[ext]'}}]}]},plugins: [new HtmlWebpackPlugin({filename: 'index.html',template: 'index.html',inject: 'body'}),new webpack.HotModuleReplacementPlugin()]
}if (isDev) {// 开发环境下config.devServer = {host: 'localhost',    // 服务器的IP地址,可以使用IP也可以使用localhostcompress: true,    // 服务端压缩是否开启port: 3000, // 端口hot: true,open: true}config.module.rules.push({test: /\.css$/,use: ['style-loader',{loader: 'css-loader',options: {importLoaders: 1}},{loader: 'postcss-loader',            // 【1】 加入了postcss-loaderoptions: {ident: 'postcss',plugins: (loader) => [                // 【2】这里使用了一些插件require('postcss-import')({ root: loader.resourcePath }),require('postcss-cssnext')(),require('autoprefixer')(),require('cssnano')()]}}]},{test: /\.less$/,use: [{loader: 'style-loader'},{loader: 'css-loader',options: {importLoaders: 1}},{loader: 'postcss-loader',options: {ident: 'postcss',plugins: (loader) => [require('postcss-import')({ root: loader.resourcePath }),require('postcss-cssnext')(),require('autoprefixer')(),require('cssnano')()]}},{loader: 'less-loader' // 如果less文件中使用了@import 引入了别的less文件,这里可以不用设置importLoaders}]},{test: /\.scss$/,use: [{loader: 'style-loader'},{loader: 'css-loader',options: {importLoaders: 1}},{loader: 'postcss-loader',options: {ident: 'postcss',plugins: (loader) => [require('postcss-import')({ root: loader.resourcePath }),require('postcss-cssnext')(),require('autoprefixer')(),require('cssnano')()]}},{loader: 'sass-loader'}]})
} else {// 生产模式下config.plugins.push(new uglify())config.plugins.push(new MiniCssExtractPlugin({filename: "[name].css",chunkFilename: "[id].css"}))config.module.rules.push({test: /\.css$/,use: [MiniCssExtractPlugin.loader,'css-loader',{loader: 'postcss-loader',            //【3】在生产模式下的修改,这里要注意的是位置的放置options: {ident: 'postcss',plugins: (loader) => [require('postcss-import')({ root: loader.resourcePath }),require('postcss-cssnext')(),require('autoprefixer')(),require('cssnano')()]}}]},{test: /\.less$/,use: [MiniCssExtractPlugin.loader,'css-loader',{loader: 'postcss-loader',options: {ident: 'postcss',plugins: (loader) => [require('postcss-import')({ root: loader.resourcePath }),require('postcss-cssnext')(),require('autoprefixer')(),require('cssnano')()]}},'less-loader']},{test: /\.scss$/,use: [MiniCssExtractPlugin.loader,'css-loader',{loader: 'postcss-loader',options: {ident: 'postcss',plugins: (loader) => [require('postcss-import')({ root: loader.resourcePath }),require('postcss-cssnext')(),require('autoprefixer')(),require('cssnano')()]}},'sass-loader']})config.module.rules.push({test: /\.(htm|html)$/i,loader: 'html-withimg-loader'})
}module.exports = config;// postcss使用
// 将`postcss-loader`添加到 `webpack.config.js` 中,您可以单独的使用它,也可以是与 `css-loader` 一起使用。在css-loader和style-loader之后使用它,但是在其他预处理器加载器(如less-loader)之前使用它
$ npm run dev
// 执行后发现前缀添加完毕,并且代码做了一定的压缩

使用babel

babel可以干什么呢?

  1. 可以让你使用使用下一代javascript代码(ES6\ES7),即使这些标准目前还没有被所有浏览器所支持
  2. 使用基于javascript进行了扩展的语言,比如Reactjsx;

安装

$ cnpm install babel-core babel-loader babel-preset-env --save-dev
// 再目录下建立.babelrc文件
{"presets":["env"]
}
// webpack.config.js
var path = require('path');
var HtmlWebpackPlugin = require('html-webpack-plugin')
var webpack = require('webpack')
const isDev = process.env.NODE_ENV === 'development'
const MiniCssExtractPlugin = require("mini-css-extract-plugin"); // 分离css
const uglify = require('uglifyjs-webpack-plugin');// js代码压缩插件
const glob = require('glob');
const PurifyCSSPlugin = require("purifycss-webpack");const config = {entry: './src/index.js',output: {path: path.resolve(__dirname, 'dist'),filename: 'js/bundle.js'},module: {rules: [{test: /\.(jpg|png|svg|gif|jpeg)$/,use: [{loader: 'url-loader',options: {limit: 500000,name: 'images/[name]-[hash].[ext]'}}]},{test: /\.js$/,            // 【1】 更改这里use: ['babel-loader'],exclude: /(node_modules|bower_components)/  // 优化处理加快速度}]},plugins: [new HtmlWebpackPlugin({filename: 'index.html',template: 'index.html',inject: 'body'}),new webpack.HotModuleReplacementPlugin(),new PurifyCSSPlugin({// Give paths to parse for rules. These should be absolute!paths: glob.sync(path.join(__dirname, 'src/*.html')),})]
}if (isDev) {// 开发环境下config.devServer = {host: 'localhost',    // 服务器的IP地址,可以使用IP也可以使用localhostcompress: true,    // 服务端压缩是否开启port: 3000, // 端口hot: true,open: true}config.module.rules.push({test: /\.css$/,use: ['style-loader',{loader: 'css-loader',options: {importLoaders: 1}},{loader: 'postcss-loader',options: {ident: 'postcss',plugins: (loader) => [require('postcss-import')({ root: loader.resourcePath }),require('postcss-cssnext')(),require('autoprefixer')(),require('cssnano')()]}}]},{test: /\.less$/,use: [{loader: 'style-loader'},{loader: 'css-loader',options: {importLoaders: 1}},{loader: 'postcss-loader',options: {ident: 'postcss',plugins: (loader) => [require('postcss-import')({ root: loader.resourcePath }),require('postcss-cssnext')(),require('autoprefixer')(),require('cssnano')()]}},{loader: 'less-loader' // 如果less文件中使用了@import 引入了别的less文件,这里可以不用设置importLoaders}]},{test: /\.scss$/,use: [{loader: 'style-loader'},{loader: 'css-loader',options: {importLoaders: 1}},{loader: 'postcss-loader',options: {ident: 'postcss',plugins: (loader) => [require('postcss-import')({ root: loader.resourcePath }),require('postcss-cssnext')(),require('autoprefixer')(),require('cssnano')()]}},{loader: 'sass-loader'}]})
} else {// 生产模式下config.plugins.push(new uglify())config.plugins.push(new MiniCssExtractPlugin({filename: "[name].css",chunkFilename: "[id].css"}))config.module.rules.push({test: /\.css$/,use: [MiniCssExtractPlugin.loader,'css-loader',{loader: 'postcss-loader',options: {ident: 'postcss',plugins: (loader) => [require('postcss-import')({ root: loader.resourcePath }),require('postcss-cssnext')(),require('autoprefixer')(),require('cssnano')()]}}]},{test: /\.less$/,use: [MiniCssExtractPlugin.loader,'css-loader',{loader: 'postcss-loader',options: {ident: 'postcss',plugins: (loader) => [require('postcss-import')({ root: loader.resourcePath }),require('postcss-cssnext')(),require('autoprefixer')(),require('cssnano')()]}},'less-loader']},{test: /\.scss$/,use: [MiniCssExtractPlugin.loader,'css-loader',{loader: 'postcss-loader',options: {ident: 'postcss',plugins: (loader) => [require('postcss-import')({ root: loader.resourcePath }),require('postcss-cssnext')(),require('autoprefixer')(),require('cssnano')()]}},'sass-loader']})config.module.rules.push({test: /\.(htm|html)$/i,loader: 'html-withimg-loader'})
}module.exports = config;

测试

// index.js
import './styles/reset.css';
import './styles/index.css';
import './styles/base.less';
import './styles/sass.scss';{let title = 'hello';document.getElementById('title').innerHTML = title;
}// 测试发现没问题

感谢您的支持!!

Webpack 4x 之路 ( 五 )相关推荐

  1. webpack 4x的安装和简单使用

    第一步 npm init 这条命令输完后会在当前目录下生成一个package.json文件 第二步 安装webpack npm install webpack -g//全局安装 npm install ...

  2. webpack学习之路

    webpack学习之路 当自己在学习webpack的时候,在网上发现中文的很详细的教程很少,于是便想将自己学习webpack的笔记记录整理下来,便有了这篇文章,希望对大家有所帮助,如果有错误,欢迎大家 ...

  3. java 设置年轻代堆大小,[JVM学习之路]五堆(一)堆的内存结构参数设置分代思想内存分配...

    [JVM学习之路]五堆(一)堆的内存结构参数设置分代思想内存分配 [JVM学习之路]五.堆(一)堆的内存结构.参数设置.分代思想.内存分配策略及TLAB 一.堆的核心概述 堆的特点: 1.一个jvm实 ...

  4. 修改html时webpack热更新,webpack学习之路(二)webpack-dev-server实现热更新

    上一章对webpack的配置有了简单的认识. 这一章,我需要学习的是webpack热更新,因为在开发过程中,不希望当文件更改时,人肉去编译文件,刷新浏览器. webpack热更新 webpack-de ...

  5. webpack学习之路(四)webpack-hot-middleware实现热更新

    上一节我学习了webpack-dev-middleware,但是单独使用它并没有实现热更新,所以这节我要学习搭配使用webpack-hot-middleware,来实现热更新功能. 创建项目 我们依然 ...

  6. 深入浅出的webpack构建工具---PostCss(五)

    一:PostCss是什么?   PostCss是一个样式处理工具,它通过自定义的插件和工具生态体系来重新定义css.它鼓励开发者使用规范的css原生语法编写代码,然后配置编译器转换需要兼容的浏览器版本 ...

  7. SpringCloud学习成长之路 五 路由器网关

    在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统.一个简答的微服务系统如下图: ...

  8. Android SurfaceFlinger 学习之路(五)----VSync 工作原理

    原址 VSync信号的科普我们上一篇已经介绍过了,这篇我们要分析在SurfaceFlinger中的作用.(愈发觉得做笔记对自己记忆模块巩固有很多帮助,整理文章不一定是用来给别人看的,但一定是为加强自己 ...

  9. Python 进阶之路 (五) map, filter, reduce, zip 一网打尽

    简洁的内置函数 大家好,我又回来了,今天我想和大家分享的是Python非常重要的几个内置函数:map,filter,reduce, zip. 它们都是处理序列的便捷函数.这很大程度上归功于函数式编程的 ...

最新文章

  1. OpenGL编程指南10:组合运动示例1—创建太阳系模型
  2. oracle 数组定义
  3. [美团 CodeM 初赛 Round A]最长树链
  4. Android四大组件之——Activity(一)定义、状态和后退栈(图文详解)
  5. NYOJ242 - 计算球体积
  6. 基于级联双向胶囊网络的鲁棒三元组知识抽取
  7. My前端bootstrap(一)
  8. rpg游戏地图绘制android,基于Android studio 的rpg游戏大地图的绘制
  9. 北大计算机考研题一般出自哪里,北大计算机考研常见问题解答
  10. 数据库sql脚本--省市县生成
  11. 【刨根问底】解决我的世界启动,报错openGL版本不足的问题
  12. 【1stopt】批处理拟合
  13. 27岁了,女生,还可以学前端开发吗?可以的话,怎么开始学呢?
  14. 在外行人眼里程序员是一个怎样的群体?
  15. Html5 Egret游戏开发 成语大挑战(四)选关界面
  16. 软件需求分析和需求文档解读
  17. 【MarkDown使用技巧】轻松搞定MarkDown
  18. 给Revit中的Button添加动画和图片
  19. 信号的Fourier分析的matlab编程
  20. 解决报错 PHP TP5框架 .env 文件产生问题如:Fatal error: Uncaught think\exception\ErrorException: in....

热门文章

  1. KDD_cup99 pytorch
  2. 五年级计算机学情分析,五年级学情分析
  3. 微信支付通知 php,微信支付开发交易通知实例
  4. 各种oracle索引类型介绍,各种Oracle索引类型介绍
  5. m3u8文件在手机上用什么软件看_新技能Get!教你制作m3u8文件 创建属于自己的直播视频列表...
  6. Python之try except异常处理工作机制和案例解析
  7. 2022年全球及中国集电环行业发展格局与十四五供需现状分析报告
  8. 全球与中国青霉素类药品市场竞争现状及发展前景预测报告2022-2028年
  9. 倡导国际农民丰收节贸易会-万祥军:中国-中东欧谋定启动.
  10. maven打war包