日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Webpack 4x 之路 ( 五 )

發(fā)布時(shí)間:2025/3/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Webpack 4x 之路 ( 五 ) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在上一篇中我們在html文件中也引用了一張圖片,打包完畢后在瀏覽器控制臺報(bào)錯(cuò):

GET file:///D:/myweb/webpack/webpack_study_demo/webpack_new_test/dist/src/asserts/login1.png net::ERR_FILE_NOT_FOUND // 意思是圖片沒找到,下面我們就來學(xué)習(xí)怎么處理HTML中的圖片路徑問題了 處理HTML中的圖片路徑問題

webpack處理資源無往不利,但有個(gè)問題總是很苦惱,html中直接使用img標(biāo)簽src加載圖片的話,因?yàn)闆]有被依賴,圖片將不會被打包。這個(gè)loader解決這個(gè)問題,圖片會被打包,而且路徑也處理妥當(dāng)。額外提供html的include子頁面功能。

安裝

$ cnpm install html-withimg-loader --save

html-withimg-loader

// webpack.config.js // 然后在生產(chǎn)環(huán)境下增加下列代碼 config.module.rules.push({test: /\.(htm|html)$/i,loader: 'html-withimg-loader'}) $ npm run build // 然后你就會發(fā)現(xiàn)上面的那個(gè)問題得到了解決,圖片成功顯示,被轉(zhuǎn)為了base64格式寫入了
css進(jìn)階: less文件的打包與處理

安裝less服務(wù)

$ 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) {// 開發(fā)環(huán)境下config.devServer = {host: 'localhost', // 服務(wù)器的IP地址,可以使用IP也可以使用localhostcompress: true, // 服務(wù)端壓縮是否開啟port: 3000, // 端口hot: true,open: true}config.module.rules.push({test: /\.css$/,use: ['style-loader', 'css-loader']},{ // 【1】 在開發(fā)模式下處理,這里使用的依舊是style-loadertest: /\.less$/,use: ['style-loader', 'css-loader', 'less-loader'] }) } else {// 生產(chǎn)模式下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】 在生產(chǎn)模式下,這里實(shí)現(xiàn)了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進(jìn)階 : SASS打包與處理

安裝

$ cnpm install sass --save-dev

這里需要 在項(xiàng)目目錄下用npm安裝兩個(gè)包。node-sass和sass-loader
因?yàn)閟ass-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) {// 開發(fā)環(huán)境下config.devServer = {host: 'localhost', // 服務(wù)器的IP地址,可以使用IP也可以使用localhostcompress: true, // 服務(wù)端壓縮是否開啟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 {// 生產(chǎn)模式下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已經(jīng)成了前端的必會技能,但是你一定為那些屬性需要加前綴,以滿足不同瀏覽器的兼容,這節(jié)課我們就學(xué)習(xí)一下如何通過postcss-loader給css3屬性自動添加前綴。

為了瀏覽器的兼容性,有時(shí)候我們必須加入-webkit,-ms,-o,-moz這些前綴。目的就是讓我們寫的頁面在每個(gè)瀏覽器中都可以順利運(yùn)行。

postcss就是一個(gè)css的處理器,它有一項(xiàng)非常好的功能就是可以為css添加前綴,這將會使得我們的開發(fā)變得非常快速

安裝

$ cnpm install --save-dev postcss-loader autoprefixer // 以及其他插件 $ cnpm install postcss-import --save-dev $ cnpm install postcss-cssnext --save-dev //一個(gè)模塊化的縮小器,建立在PostCSS生態(tài)系統(tǒng)之上。看到的代碼壓縮間距就是這個(gè)插件的效果 // 樣式編寫,在每一個(gè)樣式文件中都加這個(gè) 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) {// 開發(fā)環(huán)境下config.devServer = {host: 'localhost', // 服務(wù)器的IP地址,可以使用IP也可以使用localhostcompress: true, // 服務(wù)端壓縮是否開啟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文件,這里可以不用設(shè)置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 {// 生產(chǎn)模式下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】在生產(chǎn)模式下的修改,這里要注意的是位置的放置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` 中,您可以單獨(dú)的使用它,也可以是與 `css-loader` 一起使用。在css-loader和style-loader之后使用它,但是在其他預(yù)處理器加載器(如less-loader)之前使用它 $ npm run dev // 執(zhí)行后發(fā)現(xiàn)前綴添加完畢,并且代碼做了一定的壓縮 使用babel

babel可以干什么呢?

  • 可以讓你使用使用下一代javascript代碼(ES6\ES7),即使這些標(biāo)準(zhǔn)目前還沒有被所有瀏覽器所支持
  • 使用基于javascript進(jìn)行了擴(kuò)展的語言,比如React的jsx;
  • 安裝

    $ 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)/ // 優(yōu)化處理加快速度}]},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) {// 開發(fā)環(huán)境下config.devServer = {host: 'localhost', // 服務(wù)器的IP地址,可以使用IP也可以使用localhostcompress: true, // 服務(wù)端壓縮是否開啟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文件,這里可以不用設(shè)置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 {// 生產(chǎn)模式下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; }// 測試發(fā)現(xiàn)沒問題
    感謝您的支持!!

    總結(jié)

    以上是生活随笔為你收集整理的Webpack 4x 之路 ( 五 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。