摘要:前言由于打包工具的影響,也追求零配置搭建項目。本文就帶你繞過,用一步步搭建項目。解決文件中引入的文件名因變動而變動的問題項目源碼
1. 前言
由于 Parcel 打包工具的影響,webpack4 也追求零配置搭建項目。而前陣子出現的 vue-cli 3.0也是基于 webpack4 零配置的思想創建的。對于一些習慣webpack3 的開發者難免有些不習慣。本文就帶你繞過 vue-cli,用 webpack4 一步步搭建 vue 項目。
注:(本文講述的是webpack4基礎配置,文章有點長,請耐心看完。或者直接查看項目源碼,或者ctrl + w)
2. 項目搭建創建 createVue 文件夾,進入該文件夾, npm init 初始化項目
安裝 webpack 四件套
npm i webpack webpack-cli webpack-dev-server webpack-merge --save-dev
// 當前我使用版本 "webpack": "^4.16.3", "webpack-cli": "^3.1.0", "webpack-dev-server": "^3.1.5", // 開發服務器 "webpack-merge": "^4.1.4" // webpack 配置合并
創建相應文件
createVue |--dist |--build |--webpack.prod.js |--webpack.dev.js |--webpack.base.js |--src |--index.js |--app.vue |--index.html
// webpack.base.js // 存放 dev 和 prod 通用配置 const webpack = require("webpack"); module.exports = { entry: "./src/index.js", //入口 module: { rules: [] }, plugins: [ // 解決vender后面的hash每次都改變 new webpack.HashedModuleIdsPlugin(), ],// 插件 };
// webpack.dev.js // 存放 dev 配置 const merge = require("webpack-merge"); const common = require("./webpack.base.js"); const path = require("path"); module.exports = merge(common, { devtool: "inline-source-map", devServer: { // 開發服務器 contentBase: "../dist" }, output: { // 輸出 filename: "js/[name].[hash].js", // 每次保存 hash 都變化 path: path.resolve(__dirname, "../dist") }, module: {}, mode: "development", });
// webpack.prod.js // 存放 prod 配置 const path = require("path"); // 合并配置文件 const merge = require("webpack-merge"); const common = require("./webpack.base.js"); module.exports = merge(common, { module: {}, plugins: [], mode: "production", output: { filename: "js/[name].[contenthash].js", //contenthash 若文件內容無變化,則contenthash 名稱不變 path: path.resolve(__dirname, "../dist") }, });
webpack4 增加了 mode 屬性,設置為 development / production,以下是默認配置
development: process.env.NODE_ENV 的值設為 development 默認開啟以下插件,充分利用了持久化緩存。參考基于 webpack 的持久化緩存方案 NamedChunksPlugin :以名稱固化 chunk id NamedModulesPlugin :以名稱固化 module id production: process.env.NODE_ENV 的值設為 production 默認開啟以下插件,其中 SideEffectsFlagPlugin 和 UglifyJsPlugin 用于 tree-shaking FlagDependencyUsagePlugin :編譯時標記依賴 FlagIncludedChunksPlugin :標記子chunks,防子chunks多次加載 ModuleConcatenationPlugin :作用域提升(scope hosting),預編譯功能,提升或者預編譯所有模塊到一個閉包中,提升代碼在瀏覽器中的執行速度 NoEmitOnErrorsPlugin :在輸出階段時,遇到編譯錯誤跳過 OccurrenceOrderPlugin :給經常使用的ids更短的值 SideEffectsFlagPlugin :識別 package.json 或者 module.rules 的 sideEffects 標志(純的 ES2015 模塊),安全地刪除未用到的 export 導出 UglifyJsPlugin :刪除未引用代碼,并壓縮
// index.js // 需 npm i vue --save import Vue from "vue"; import App from "./App.vue" import "./index.scss" new Vue({ el: "#app", render: h => h(App), });
hello world
Suporka Vue App
安裝 vue 核心解析插件
npm i vue-loader vue-template-compiler --save-dev
// 當前我使用版本 "vue-loader": "^15.2.6", "vue-template-compiler": "^2.5.17",
由于 vue 的解析在 dev 和 prod 中均需使用,因此歸入基本配置 base
// webpack.base.js // ...省略號 // vue-loader 插件 const VueLoaderPlugin = require("vue-loader/lib/plugin"); module.exports = { //...省略號 module: { rules: [ { test: /.vue$/, loader: "vue-loader" } ] }, plugins: [ // 請確保引入這個插件來施展魔法 new VueLoaderPlugin(), ] };
安裝 html 模板解析插件
npm i html-webpack-plugin --save-dev
// 當前版本 "html-webpack-plugin": "^3.2.0"
html 解析也屬于基本配置,歸入 base
// webpack.base.js // ...省略號 // html插件 const HtmlWebpackPlugin = require("html-webpack-plugin"); module.exports = { //...省略號 plugins: [ //...省略號 new HtmlWebpackPlugin({ template: path.resolve(__dirname, "../index.html"), }), ] };
創建 npm 命令
"scripts": { "start": "webpack-dev-server --hot --open --config build/webpack.dev.js", "build": "webpack --config build/webpack.prod.js" },
--hot 模塊熱替換
--open 開啟本地服務器
此時 npm start,項目可正常運行
3. 功能拓展添加 loader
CSS loader (包括前處理和后處理)
CSS 基礎 loader
"css-loader": "^1.0.0", "style-loader": "^0.21.0",
CSS 前處理 less 兩件套
"less": "^3.8.0", "less-loader": "^4.1.0",
CSS 前處理 sass 兩件套
"node-sass": "^4.9.2", "sass-loader": "^7.1.0",
CSS 后處理 postcss 兩件套
"postcss-loader": "^2.1.6", "autoprefixer": "^9.1.0",
并在根文件夾創建 postcss.config.js 文件
// postcss.config.js // 自動添加css兼容屬性 module.exports = { plugins: [ require("autoprefixer") ] }
安裝以上依賴,在 base 文件中加入一下 loader 代碼
// webpack.base.js // ...省略號 rules: [ { test: /.(sa|sc|c)ss$/, use: [ "style-loader", "css-loader", "postcss-loader", "sass-loader", ], }, { test: /.less$/, use: [ "style-loader", "css-loader", "postcss-loader", "less-loader", ], }, ]
圖片 loader
解析圖片,字體等都是用 file-loader,安裝npm i file-loader --save-dev
base 文件加入配置
// webpack.base.js // ...省略號 rules: [ // ...省略號 { test: /.(png|svg|jpg|gif)$/, use: [ { loader: "file-loader", options: { limit: 5000, // 分離圖片至imgs文件夾 name: "imgs/[name].[ext]", } }, ] }, ]4. 打包優化
解決每次重新打包,dist 文件夾文件未清除
安裝 clean-webpack-plugin 插件
// webpack.prod.js // 打包之前清除文件 const CleanWebpackPlugin = require("clean-webpack-plugin"); // ...省略號 plugins: [ new CleanWebpackPlugin(["dist/*"], { root: path.resolve(__dirname, "../") }), ]
分離 CSS
webpack4 中使用 mini-css-extract-plugin 插件來分離 css。
安裝 mini-css-extract-plugin 插件后
// webpack.prod.js // 分離CSS插件 const MiniCssExtractPlugin = require("mini-css-extract-plugin"); // ...省略號 plugins: [ new MiniCssExtractPlugin({ filename: "css/[name].[hash].css", chunkFilename: "css/[id].[hash].css" }), ]
另外,還需將各個 css loader中的style-loader 替換為 MiniCssExtractPlugin
圖片壓縮使用 image-webpack-loader, 安裝后
代碼如下:
// webpack.prod.js // ...省略號 rules: [ { test: /.(sa|sc|c)ss$/, use: [ { loader: MiniCssExtractPlugin.loader, options: { // you can specify a publicPath here // by default it use publicPath in webpackOptions.output publicPath: "../" } }, "css-loader", "postcss-loader", "sass-loader", ], }, { test: /.less$/, use: [ { loader: MiniCssExtractPlugin.loader, options: { // you can specify a publicPath here // by default it use publicPath in webpackOptions.output publicPath: "../" } }, "css-loader", "postcss-loader", "less-loader", ], }, { test: /.(png|svg|jpg|gif)$/, use: [ { loader: "file-loader", options: { limit: 5000, name: "imgs/[hash].[ext]", } }, // 圖片壓縮 { loader: "image-webpack-loader", options: { // bypassOnDebug: true, mozjpeg: { progressive: true, quality: 65 }, optipng: { enabled: false, }, pngquant: { quality: "65-90", speed: 4 }, gifsicle: { interlaced: false, } }, }, ] }, ]
使用 happypack 多進程加快編譯速度
同時也需要安裝 babel 兩件套
"babel-core": "^6.26.3", "babel-loader": "^7.1.5", "happypack": "^5.0.0",
happypack 開發生產環境都用到,配置歸入 base
// webpack.base.js // 使用happypack const HappyPack = require("happypack"); const os = require("os"); const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length }); // ...省略號 rules: [ { test: /.js$/, //把對.js 的文件處理交給id為happyBabel 的HappyPack 的實例執行 loader: "happypack/loader?id=happyBabel", //排除node_modules 目錄下的文件 exclude: /node_modules/ }, ]
分離不常變化的文件,如 node_modules 下引用的庫
// webpack.prod.js module.exports = merge(common, { // ...省略號 optimization: { // 分離chunks splitChunks: { chunks: "all", cacheGroups: { vendor: { name: "vendor", test: /[/]node_modules[/]/, priority: 10, chunks: "initial" // 只打包初始時依賴的第三方 }, } }, }, })
如此配置,則打包的 js 文件夾中會多一個 vendor.js
壓縮CSS和JS代碼
安裝 optimize-css-assets-webpack-plugin 和 uglifyjs-webpack-plugin 插件
// webpack.prod.js // 壓縮CSS和JS代碼 // ...省略號 const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin"); const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); module.exports = merge(common, { // ...省略號 optimization: { // ...省略號 minimizer: [ // 壓縮JS new UglifyJsPlugin({ uglifyOptions: { compress: { warnings: false, // 去除警告 drop_debugger: true, // 去除debugger drop_console: true // 去除console.log }, }, cache: true, // 開啟緩存 parallel: true, // 平行壓縮 sourceMap: false // set to true if you want JS source maps }), // 壓縮css new OptimizeCSSAssetsPlugin({}) ] }, })
最后,再拓展一個 hash, chunkhash, contenthash 的區別
hash是跟整個項目的構建相關,只要項目里有文件更改,整個項目構建的hash值都會更改,并且全部文件都共用相同的hash值
chunkhash和hash不一樣,它根據不同的入口文件(Entry)進行依賴文件解析、構建對應的chunk,生成對應的哈希值。
contenthash 更細致地根據內容更改,生成對應的哈希值。解決chunkhash 文件中引入的文件名因 chunkhash 變動而變動的問題
項目源碼
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/97680.html
摘要:的開發環境配置說明完整的的配置地址開發環境的搭建,總體而言就比較輕松,因為用戶就是開發者們。的做法是在的字段配置類似這樣這樣配置后,當運行時,在里通過可以取到值以來做判斷就可以啦。 webpack4 的開發環境配置說明 完整的webpack4的配置clone地址: https://github.com/ziwei3749/... 開發環境的搭建,總體而言就比較輕松,因為用戶就是開發者們...
摘要:后來經過排查你會發現是由于目前還沒有版本。可以使用該方式解決。這就是我為什么不推薦你使用創建腳手架的原因此文的受眾是想要進階中級的初級前端人員。 最近在知乎看到一個問題,原問題如下: 很奇怪,為什么現在能找到自己手動創建vue腳手架的文章非常少,而且大家似乎對webpack4的熱情并不高,對于想基于vue2.0+webpack4搭建一個腳手架的我來說資料真是少得可憐。難道現在一般的做...
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
閱讀 3964·2021-11-11 10:58
閱讀 3339·2021-09-26 09:46
閱讀 1918·2019-08-30 15:55
閱讀 983·2019-08-30 13:52
閱讀 1951·2019-08-29 13:11
閱讀 3031·2019-08-29 11:27
閱讀 1524·2019-08-26 18:18
閱讀 2634·2019-08-23 14:17