摘要:項目地址一知識獲取當前文件所在路徑,等同于把一個路徑或路徑片段的序列解析為一個絕對路徑給定的路徑的序列是從右往左被處理的,后面每個被依次解析,直到構造完成一個絕對路徑如果處理完全部給定的片段后還未生成一個絕對路徑,則當前工作目錄會被用上生成
項目git地址
一、node知識__dirname: 獲取當前文件所在路徑,等同于path.dirname(__filename)
console.log(__dirname); // Prints: /Users/mjr console.log(path.dirname(__filename)); // Prints: /Users/mjr
path.resolve([..paths]): 把一個路徑或路徑片段的序列解析為一個絕對路徑
給定的路徑的序列是從右往左被處理的,后面每個 path 被依次解析,直到構造完成一個絕對路徑
如果處理完全部給定的 path 片段后還未生成一個絕對路徑,則當前工作目錄會被用上
生成的路徑是規范化后的,且末尾的斜杠會被刪除,除非路徑被解析為根目錄
長度為零的 path 片段會被忽略
如果沒有傳入 path 片段,則 path.resolve() 會返回當前工作目錄的絕對路徑
path.resolve("/foo/bar", "./baz"); // 返回: "/foo/bar/baz" path.resolve("/foo/bar", "/tmp/file/"); // 返回: "/tmp/file" path.resolve("wwwroot", "static_files/png/", "../gif/image.gif"); // 如果當前工作目錄為 /home/myself/node, // 則返回 "/home/myself/node/wwwroot/static_files/gif/image.gif"二、配置最基本的webpack
項目目錄生成如下文件
. ├── build │?? ├── build.js │?? ├── index.html │?? ├── webpack.base.conf.js │?? ├── webpack.dev.conf.js │?? └── webpack.prod.conf.js ├── package.json ├── package-lock.json └── src ├── App.vue ├── main.js ├── timg.gif └── timg.jfif
首先,先裝下webpack依賴:
npm i webpack webpack webpack-cli -D1、webpack.base.conf.js
const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin"); module.exports = { entry: { bundle: path.resolve(__dirname, "../src/main.js") }, output: { path: path.resolve(__dirname, "../dist"), filename: "[name].[hash].js", publicPath: "/" }, module: { rules: [ ] }, plugins: [ new HtmlWebpackPlugin({ template: path.resolve(__dirname, "index.html") }) ], resolve: { } };
上面用到了html-webpack-plugin插件,裝下:
npm i html-webpack-plugin -D2、webpack.dev.conf.js
const merge = require("webpack-merge"); const path = require("path"); const baseConfig = require("./webpack.base.conf"); module.exports = merge(baseConfig, { // mode關系到代碼壓縮質量 https://webpack.docschina.org/guides/tree-shaking/ mode: "development", // source-map,將編譯后的代碼映射到原代碼,便于報錯后定位錯誤 devtool: "inline-source-map", devServer: { contentBase: path.resolve(__dirname, "../dist"), open: true } });
合并webpack配置的插件webpack-merge,能夠啟一個簡易服務的webpack-dev-server,詳情
npm i webpack-dev-server webpack-merge -D3、webpack.prod.conf.js
const merge = require("webpack-merge"); const CleanWebpackPlugin = require("clean-webpack-plugin"); const path = require("path"); const baseConfig = require("./webpack.base.conf"); module.exports = merge(baseConfig, { mode: "production", devtool: "source-map", module: { rules: [] }, plugins: [ new CleanWebpackPlugin(["dist/"], { root: path.resolve(__dirname, "../") }) ] });
清除文件的插件:
npm i clean-webpack-plugin -D4、build.js
const webpack = require("webpack"); const config = require("./webpack.prod.conf"); webpack(config, (err, stats) => { if (err || stats.hasErrors()) { // 在這里處理錯誤 console.error(err); return; } // 處理完成 console.log(stats.toString({ chunks: false, // 使構建過程更靜默無輸出 colors: true // 在控制臺展示顏色 })); });5、npm scripts
// package.json { +++ "scripts": { "build": "node build/build.js", "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js" }, }
以上算是一個webpack的基本結構,如果入口文件(main.js)里引入的是正經js,npm dev和npm build是可以的打包編譯的,但是我們是要寫vue,那就要加些loader和plugins了
三、引入一些基本的loader 1、babel-loader依賴安裝要求:webpack 4.x | babel-loader 7.x | babel 6.x,注意babel-loader和babel的版本,不然會報錯
npm install -D babel-loader@7 babel-core babel-preset-env webpack
然后再配置中加入
// base.conf.js module.exports = { +++ module: { rules: [ { test: /.js$/, exclude: /node_modules/, use: { loader: "babel-loader", } }, +++ ] } }
我們還需要添加一個配置文件(.babelrc)在根目錄下:
/// .babelrc { "presets": [ ["env", { "targets": { "browsers": [">0.25%", "last 2 versions", "not ie 11", "not op_mini all"] } }] ] }
這就是 babel-preset-env 的作用,幫助我們配置 babel。我們只需要告訴它我們要兼容的情況(目標運行環境),它就會自動把代碼轉換為兼容對應環境的代碼。
以上代碼表示我們要求代碼兼容最新兩個版本的瀏覽器,不用兼容 11(及以下)和Opera Mini,另外市場份額超過 0.25% 的瀏覽器也必須支持。
只需要告訴 babel-preset-env 你想要兼容的環境,它就會自動轉換
如果我們希望在頁面引入圖片(包括img的src和background的url)。當我們基于webpack進行開發時,引入圖片會遇到一些問題
其中一個就是引用路徑的問題。拿background樣式用url引入背景圖來說,我們都知道,webpack最終會將各個模塊打包成一個文件,因此我們樣式中的url路徑是相對入口html頁面的,而不是相對于原始css文件所在的路徑的。這就會導致圖片引入失敗。這個問題是用file-loader解決的,file-loader可以解析項目中的url引入(不僅限于css),根據我們的配置,將圖片拷貝到相應的路徑,再根據我們的配置,修改打包后文件引用路徑,使之指向正確的文件
另外,如果圖片較多,會發很多http請求,會降低頁面性能。這個問題可以通過url-loader解決。url-loader會將引入的圖片編碼,生成dataURl。相當于把圖片數據翻譯成一串字符。再把這串字符打包到文件中,最終只需要引入這個文件就能訪問圖片了。當然,如果圖片較大,編碼會消耗性能。因此url-loader提供了一個limit參數,小于limit字節的文件會被轉為DataURl,大于limit的還會使用file-loader進行copy。
url-loader和file-loader是什么關系呢?簡答地說,url-loader封裝了file-loader。url-loader賴于file-loader,即使用url-loader時,也要安裝file-loader
npm i url-loader file-loader -D
/// base.conf.js module.exports = { +++ module: { rules: [ +++ { test: /.(png|jpg|jfif|jpeg|gif)$/, use: [ { loader: "url-loader", options: { // 低于這個limit就直接轉成base64插入到style里,不然以name的方式命名存放 // 這里的單位時bit limit: 8192, name: "static/images/[hash:8].[name].[ext]" } } ] }, // 字體圖標啥的,跟圖片分處理方式一樣 { test: /.(woff|woff2|eot|ttf|otf)$/, use: [ { loader: "url-loader", name: "static/font/[hash:8].[name].[ext]" } ] }, ] }, }3、vue-loader
作用自己去看
npm i vue-loader -D
// base.conf.js module.exports = { +++ module: { rules: [ +++ { test: /.vue$/, loader: "vue-loader" } ] } }
在這里還要一個插件,這個插件是必須的!
// base.conf.js const VueLoaderPlugin = require("vue-loader/lib/plugin") module.exports = { +++ plugins: [ // 它的職責是將你定義過的其它規則復制并應用到 .vue 文件里相應語言的塊。 // 例如,如果你有一條匹配 /.js$/ 的規則,那么它會應用到 .vue 文件里的
好了,npm dev 先看一下女神,放松一下:
四、做一些優化 1、提取公共代碼使用 splitChucksPlugin 插件,這是 Webpack 自帶的,不用安裝第三方依賴,默認配置即可
module.exports = { +++ plugins: [ +++ new webpack.optimize.SplitChunksPlugin() ] }
想了解這個插件的默認配置及如何配置,英文,中文
2、將第三方庫多帶帶打包每次我們對項目進行打包時,我們都會把引用的第三方依賴給打包一遍,比如 Vue、Vue-Router、React 等等。但是這些庫的代碼基本都是不會變動的,我們沒必要每次打包都構建一次,所以我們最好將這些第三方庫提取出來多帶帶打包,這樣有利于減少打包時間。
官方插件是 DllPlugin。推薦一個比較好用的插件 —— autodll-webpack-plugin
npm i autodll-webpack-plugin -D
// base.conf.js module.exports = { +++ plugins: [ // 將一些不太可能改動的第三方庫多帶帶打包,會通過緩存極大提升打包速度 new AutoDllPlugin({ // will inject the DLL bundle to index.html // default false inject: true, debug: false, filename: "[name]_[hash].js", path: "static", entry: { // [name] = vue, 在這里會將entry里的每個item(vue,jquery)都打包成一個js vue: [ "vue", "vue-router" ], // [name] = jquery // jquery: [ // "jquery", // "jquery-from" // ] } }), +++ ] }
inject 為 true,插件會自動把打包出來的第三方庫文件插入到 HTML。filename 是打包后文件的名稱。path 是打包后的路徑。entry 是入口,vendor 是你指定的名稱,數組內容就是要打包的第三方庫的名稱,不要寫全路徑,Webpack 會自動去 node_modules 中找到的。
每次打包,這個插件都會檢查注冊在 entry 中的第三方庫是否發生了變化,如果沒有變化,插件就會使用緩存中的打包文件,減少了打包的時間,這時 Hash 也不會變化。
“熱重載”不只是當你修改文件的時候簡單重新加載頁面。啟用熱重載后,當你修改 .vue 文件時,該組件的所有實例將在不刷新頁面的情況下被替換。它甚至保持了應用程序和被替換組件的當前狀態!當你調整模版或者修改樣式時,這極大地提高了開發體驗,以下兩種方式擇一即可
方式1:啟動的時候通過--hot選項就ok了,webpack,vue-loader
"scripts": { +++ "dev": "webpack-dev-server --hot --inline --progress --config build/webpack.dev.conf.js" },
方式2:或者通過配置webpack.dev.config.js,相比第一種,就會麻煩一點
const webpack = require("webpack") module.exports = { +++ module: { devServer: { +++ // 開啟熱重載 hot: true }, plugins: [ // 啟用模塊熱替換(HMR) new webpack.HotModuleReplacementPlugin(), // 當開啟 HMR 的時候使用該插件會顯示模塊的相對路徑,建議用于開發環境。 new webpack.NamedModulesPlugin(), +++ ] } }4、eslint
確保 VS Code 安裝了 Vetur(設置編輯器支持vue文件,如果寫過vue忽略) 和 Eslint 插件
npm i -g eslint@latest eslint --init
然后選個最流行的就行了
"
})
代碼如果eslint有報錯,就讓編譯不通過
npm i eslint-loader babel-eslint -D
{ +++ "parser": "babel-eslint" }
module.exports = { module: { rules: [ { test: /.(vue|js)$/, loader: "eslint-loader", exclude: /node_modules/, // 預處理 enforce: "pre", include: [path.join(__dirname, "..", "src")] } ] } }
代碼提交之前對代碼進行檢查
npm i husky -D
{ +++ "script": { +++ "precommit": "eslint --fix --ext .js --ext .vue src/" } }
該工具可以在我們提交代碼時,調用"precommit"鉤子,執行預處理操作,eslint不通過,無法提交
在提交時僅對git add的 js,vue 文件進行檢測lint-staged 和 husky 在 pre-commit 階段做代碼檢查
npm i lint-staged -D
{ +++ "script": { +++ "precommit": "lint-staged" }, "lint-staged": { "src/**/*.{js,vue}": [ "eslint --fix", "git add" ] }, }5、引入jquery shimming
npm i juery -D
module.exports = { +++ plugins: [ +++ new webpack.ProvidePlugin({ $: "jquery" }) ] };
這樣就可以將$當全局變量使用了,當然eslint要配置個global,這里不介紹了
對你有幫助的話點個刷波6,點個贊吧
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99158.html
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
摘要:的開發環境配置說明完整的的配置地址開發環境的搭建,總體而言就比較輕松,因為用戶就是開發者們。的做法是在的字段配置類似這樣這樣配置后,當運行時,在里通過可以取到值以來做判斷就可以啦。 webpack4 的開發環境配置說明 完整的webpack4的配置clone地址: https://github.com/ziwei3749/... 開發環境的搭建,總體而言就比較輕松,因為用戶就是開發者們...
摘要:課程地址全部課程地址立即進入課程源碼目錄截至按照知識點,目錄分成了個文件夾之后還會持續更新。個人網站原文鏈接系列教程前言 本文檔已經過時,最近內容請看:https://godbmw.com/passage/76。一共16節課程和代碼。謝謝支持。 1. 什么是webpack? 前端目前最主流的javascript打包工具,在它的幫助下,開發者可以輕松地實現加密代碼、多平臺兼容。而最重要的...
閱讀 3209·2021-11-12 10:36
閱讀 1258·2019-08-30 15:56
閱讀 2444·2019-08-30 11:26
閱讀 551·2019-08-29 13:00
閱讀 3609·2019-08-28 18:08
閱讀 2749·2019-08-26 17:18
閱讀 1893·2019-08-26 13:26
閱讀 2432·2019-08-26 11:39