webpack4x 简述
webpack作为时下非常火的项目构建工具 已经有了非常多成熟的脚手架 vue-cli nuxt 但是有的时候我们需要自己实现一个比较符合自己需求的webpack配置就会有很多坑我这边简单提一些
第一个坑 现在的webpack不同于老版本 需要安装全局webpack 与webpack-cli才能运行按照下面操作执行
npm install -g webpack
npm install webpack-cli -g
创建项目
npm init
安装本地
npm i webpack --save--dev
npm i webpack-cli --save--dev
安装本地一方面是提示依赖 一方面也是为了防止全局webpack与本地依赖包不兼容等bug导致项目无法运行
webpack4x之后又两种mode 我们可用可不用
development 开发模式
production 产出模式
安装完基本依赖之后就是创建入口文件webpack.config.js 我下面放一个我简单配置的文件然后简述一下坑点
const path = require('path') const webpack = require('webpack') const HtmlWebpackPlugin = require('html-webpack-plugin') const ExtractTextPlugin = require('extract-text-webpack-plugin') const CleanWebpackPlugin = require('clean-webpack-plugin') const glob = require('glob') const CopyWebpackPlugin = require('copy-webpack-plugin') const PurifyCssWebpack = require('purifycss-webpack'); //html页面模板与输出模板 const getHtmlConfig = function (name, title) { return { template: path.resolve(__dirname,'src/view/' + name + '.html'), filename: name + '.html', title: title, inject: true, //嵌入页面 hash: true, chunks: ['common','base', name], //引入这些js minify: { collapseWhitespace:true, // 合并空白字符 removeComments:true, // 移除注释 removeAttributeQuotes:true // 移除属性上的引号 } } } const config = { //开发模式 // mode:'development', //生产模式 // mode:'production entry: { 'common': ['./src/page/common/index.js'], 'index': ['./src/page/index/index.js'], 'list': ['./src/page/list/index.js'] }, output: { path: path.resolve(__dirname, './dist'), filename: 'js/[name]-[hash:5].js', publicPath:'/' }, //别名 resolve: { alias: { node_modules: __dirname + '/node_modules', util: __dirname + '/src/util', page: __dirname + '/src/page', service: __dirname + '/src/service', image: __dirname + '/src/image' } }, //别名 module: { rules:[ //处理css { test:/\.css$/, use:[{loader:'style-loader'},{loader:'css-loader'},{loader:'postcss-loader'} ], use:ExtractTextPlugin.extract({ fallback:'style-loader', use: ['css-loader','postcss-loader'], publicPath:'../' }) }, // 处理less { test:/\.less$/,// 处理less use:ExtractTextPlugin.extract({ fallback:'style-loader', use:['css-loader','less-loader'] }) }, // 处理sass { test:/\.scss$/, use:ExtractTextPlugin.extract({ fallback:'style-loader', use:['css-loader','sass-loader'] }) }, // 处理stylus { test:/\.styl$/, use:ExtractTextPlugin.extract({ fallback:'style-loader', use:['css-loader','stylus-loader'] }) }, //处理js { test:/\.(js|jsx)$/, use:['babel-loader'], exclude:/node_modules/ //剔除node_modules模块 }, //处理图片 { test:/\.(gif|png|jpg|woff|svg|eot|ttf)\??.*$/, use:[{ loader:'url-loader', options:{ limit:5000, //设置转base64的警戒值 outputPath: 'images' //图片打包出去的目录 } }] } ] }, //分割提取公共代码 optimization:{ splitChunks: { chunks: "async", minSize: 2, minChunks: 1, maxAsyncRequests: 5, maxInitialRequests: 3, name: true, cacheGroups: { default: { minChunks: 2, priority: -20, reuseExistingChunk: true, }, vendors: { test: /([\\/]node_modules[\\/]|[\\/]page[\\/])/, priority: -10 } } } }, devServer:{ //设置服务器访问的基本目录 contentBase:path.resolve(__dirname, 'dist'), // 要求服务器访问dist目录 host:'localhost', // 设置服务器ip地址,可以是localhost port:8090, // 设置端口号 open:true, //自动拉起浏览器 hot:true //模块热跟新 }, plugins: [ new CopyWebpackPlugin([{ // 静态文件输出 也就是复制粘贴 from:path.resolve(__dirname,'src/assets'), //将哪里的文件 to:'./pullic' // 复制到哪里 }]), //热更新 new PurifyCssWebpack({ // 消除冗余css代码 paths:glob.sync(path.join(__dirname,'src/view/*.html')) //path.join合并路径 }), new webpack.HotModuleReplacementPlugin(), //将css单独打包到css文件 new ExtractTextPlugin("css/[name].css"), // 打包之前先清理dist目录 new CleanWebpackPlugin(['dist']), //提取公共代码创建缓存组 new HtmlWebpackPlugin(getHtmlConfig('index','首页')), // new HtmlWebpackPlugin(getHtmlConfig('list','列表页')) ] } module.exports = config
第一步html-plugin-webpack的使用 这个不必多少大家肯定了解 主要是设置模板文件和输出文件名 等可以按照我的配置来 这里没什么坑点
第二步一般开始用webpack-dev-server了这里就巨坑了尤其是热更新这一块
我们知道devserver为了快速开发是把我们的项目打包到内存中的默认是根路径 output中可以设置path和publicPath path是设置打包后的文件路径 publicPath 是设置打包后资源文件引用的前缀路径 这里需要注意
contentBase 参数可以配置我们的项目启动路径 但是由于devserver是默认编译打包到根路径内存所以此坑新手很容易踩到 那么如何改变devserver的编译路径呢 有人说publicPath实际上我试了并不行 这里的编译目录还是这个参数指定
热更新 这里出现有时候热更新有时候不行 是因为 webpack4的模块机制发生了改变,都是关于hot-module的,chunkId的一些问题
项目启动后就是各种loader的配置这里没什么坑比较简单
最大的坑还是CommonsChunkPlugin的废弃这里我们怎么分包呢采用了(optimization.splitChunks 和 optimization.runtimeChunk)有兴趣可以去官方研究下不过鉴于webpack的文档更新 大家也可以自行研究当然还有很多坑 爬坑也是一种乐趣