赞
踩
css压缩主要用到的是optimize-css-assets-webpack-plugin
npm install --save-dev optimize-css-assets-webpack-plugin
引入
var OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');
plugins中new
new OptimizeCssAssetsPlugin()
webpack.config.js
// 当运行webpack时,会加载这个文件中色配置,指示webpack怎么干活 const { resolve } = require("path"); // nodejs的一个模块 resolve用来拼接绝对路径 // 自动生成html的插件-根据模板页面生成新的页面 var HtmlWebpackPlugin = require('html-webpack-plugin'); // 清除之前打包的文件 var CleanWebpackPlugin = require('clean-webpack-plugin'); //这个插件可以把css单独打包成一个文件 const MiniCssExtractPlugin = require('mini-css-extract-plugin'); var OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin'); // 设置一下node环境变量一下 process.env.NODE_ENV = "development" //所有构建工具都是基于nodejs平台运行的,使用commonjs module.exports = { //入口文件 entry:"./src/index.js", //输出文件 output:{ //输出文件名 filename: "main.js", //filename:"js/main.js" 就会将文件打包到js目录下的main.js //输出路径 //_dirname是nodejs变量,代表当前文件(即webpack.config.js)的绝对路径 __dirname就是module-A path:resolve(__dirname,"build") }, //loader的配置 module: { rules:[ // 语法检查: eslint-loader eslint // 注意:只检查自己写的源代码,第三方库自己检查过了,我们不需要检查。而且eslint只针对js, //所以我们用exclude排除node_modules //需要我们自己设置检查规则,在package.json中的eslintConfig中设置:aribnb(一个js风格指南) // "eslintConfig": { // "extends": "airbnb-base" // } //airbnb=>eslint-config-airbnb-base eslint eslint-plugin-import { test: /\.js$/, loader: 'eslint-loader', exclude: /node_modules/, options: { //eslint检查出现的错误,通过fix:true会自动修复 //此时一些本来红色的报错就会消失,会有一些黄色的警告 //比如console,可以通过 //eslint-disable-next-line 不进行eslint检查 fix: true } }, //详细loader配置 { //test 通常用正则表达式,表示匹配那些文件 test: /\.css$/, use: [ MiniCssExtractPlugin.loader, "css-loader", { loader:"postcss-loader", //如果是使用autoprefixer插件 options:{ postcssOptions:{ plugins:[require('autoprefixer')({ overrideBrowserslist:['last 2 versions','>1%',"ios 7"] })] } }
// options: { // ident: 'postcss', //postcssOptions: { // plugins: [ // require("postcss-preset-env")(), //] // } //postcss的插件 // } } ] }, { test: /\.(jpg|png|gif)$/, //下载 url-loader和file-lodaer,因为url-loader依赖file-loader loader:"url-loader", options:{ //图片大小小于 8kb 会base64处理 //base64优点:减少请求数量(减轻服务器压力) 缺点:体积会变大,文件请求速度变慢 // 8-12kb以下的图片用base64处理 limit: 8*1024, //打包后图片的名字是hash值,所以[hash: 10]表示取前十位hash, //ext表示用原来的扩展名 name:'[hash:10].[ext]', // //关闭es6模块化 esModule: false, outputPath:"imgs" //会将打包后的图片放到imgs下 } }, { test: /\.html$/, //专门处理html文件中的图片,负责引入图片,从而可以被url-loader处理 loader: 'html-loader', options:{ //url-loader默认使用es6的模块化解析,html打包后引入的图片是commonjs引入 //解决:关闭url-loader的esModule esModule:false, } }, ] }, plugins:[ //默认创建一个空的html,自动引入打包输出的所有资源(js/css) //template会提供‘index.html’作为模板,将js资源用script引入,css用link引入 new HtmlWebpackPlugin({template: "./src/index.html"}), new MiniCssExtractPlugin({filename:'css/main.css'}), new OptimizeCssAssetsPlugin() ], //模式 mode:"development", //production' devServer: { contentBase: resolve(__dirname,"build"), //代表要运行的项目的目录,构建后的项目路径 compress: true, //启动GZIP压缩,让代码体积更小 port: 3000, //端口 open: true, //是否默认打开浏览器 } }
package.json
{ "name": "module-A", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "clean-webpack-plugin": "^4.0.0-alpha.0", "css-loader": "^5.2.4", "eslint": "^7.32.0", "eslint-config-airbnb-base": "^14.2.1", "eslint-loader": "^4.0.2", "eslint-plugin-import": "^2.23.4", "file-loader": "^6.2.0", "html-loader": "^2.1.2", "html-webpack-plugin": "^5.3.2", "less": "^4.1.1", "less-loader": "^8.1.1", "mini-css-extract-plugin": "^2.1.0", "optimize-css-assets-webpack-plugin": "^6.0.1", "postcss": "^8.3.6", "postcss-loader": "^6.1.1", "postcss-preset-env": "^6.7.0", "style-loader": "^2.0.0", "url-loader": "^4.1.1", "webpack": "^5.33.2", "webpack-cli": "^3.3.12", "webpack-dev-server": "^3.11.2" }, "browserslist": { "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ], "production": [ "ie > 6", ">1%", "not dead", "not op_mini all" ] }, "eslintConfig": { "extends": "airbnb-base" } }
1.使用babel-loader进行兼容性处理
2.下载babel-loader @babel/preset-env @babel/core
注意: bable-loader一定要在8版本以上, @babel/preset-env @babel/core在以前的版本是 babel-preset-env babel-core会和8版本的babael-loader不兼容
const { resolve } = require("path"); module.exports = { entry: './index.js', output: { filename: 'bundle.js', path: resolve(__dirname,"build") }, module:{ rules:[ //原则上一个文件只能被一个loader进行处理,但是js文件需要eslint也需要babel。那么此时就一定要注意书写顺序,一定要eslint在babel上面 //原因如下:1,eslint检查出错,下面的一切执行都没有意义了。2,babel会将es6转换成es5,var这些在eslint看来是错误 //可以给eslint-loader加一个配置enforce:"pre" //loader的配置 { test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader', options: { presets: ["@babel/preset-env"] } } ] }, mode:"development", //production' }
至此,我们可以完成基本的je6转换为es5,比如const,let,箭头函数等。但是我们想要转换promise这些,就不能实现了。我们需要下载新的一个插件
在我们打包前的源码js中直接 import "@babel/polyfill"
*引用上面的插件会产生一个问题,就是打包后的文件体积过大,我们其实只是想处理部分兼容性问题,却引用了所有的兼容性处理包,需要做成按需====》core-js*
npm i core-js -D
使用这个插件之后,就不要再js中引入polyfill了
//webpack.config.js const { resolve } = require("path"); module.exports = { entry: './index.js', output: { filename: 'bundle.js', path: resolve(__dirname,"build") }, module:{ rules:[ { test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader', options: { presets: [["@babel/preset-env", { //按需加载 "useBuiltIns": "usage", corejs:{ version: 3 }, //指定兼容性做到那个浏览器版本 target: { chrome: '60', firefox: '60', ie: '9', safari: '10' } } ]] } } ] }, mode:"development", //production' }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。