1. 程式人生 > 其它 >基於nodejs(koa2)服務實現圖片檔案的上傳功能

基於nodejs(koa2)服務實現圖片檔案的上傳功能

注意

視口單位中的“視口”,桌面端指的是瀏覽器的可視區域;移動端指的就是Viewport中的Layout Viewport。

使用這個方案有一點千萬別忘了,記得在加入:

<meta name="viewport" content="width=device-width,
initial-scale=1,maximum-scale=1,minimum-scale=1,user-scalable=no" 
/>

一、安裝gulp及對應元件

全域性安裝 gulp:

yarn global add gulp

作為專案的開發依賴(devDependencies)安裝:

yarn add -D gulp
yarn add -D gulp-less
yarn add -D gulp-postcs
yarn add -D gulp-rename
yarn add -D postcss-px-to-viewport

二.新增gulpfile.js

在專案根目錄下建立一個名為 gulpfile.js 的檔案:

裡面書寫以下程式碼:

const { src, dest, watch, task, series } = require('gulp');
var less = require('gulp-less');
var postcss = require('gulp-postcss');
var rename = require('gulp-rename');
var pxtoviewport = require('postcss-px-to-viewport');

function buildCss() {
	//配置的引數
	var processors = [
		pxtoviewport({
			unitToConvert: 'px',
			viewportWidth: 750, //視窗的寬度,對應的是我們設計稿的寬度,一般是750
			viewportHeight: 1334, // 視窗的高度,根據750裝置的寬度來指定,一般指定1334,也可以不配置
			unitPrecision: 5, // 指定`px`轉換為視窗單位值的小數位數(很多時候無法整除)
			viewportUnit: 'vw', // 指定需要轉換成的視窗單位,建議使用vw
			fontViewportUnit: 'vw', // vmin is more suitable.
			selectorBlackList: [],
			minPixelValue: 1, // 小於或等於`1px`不轉換為視窗單位,你也可以設定為你想要的值
			mediaQuery: false, // 允許在媒體查詢中轉換`px`
		}),
	];
	return (
		src(['src/style/*.less']) //原始css路徑
			.pipe(less())
			.pipe(postcss(processors)) //這是自動編譯px為vw單位
			.pipe(rename({ extname: '.min.css' })) 
			.pipe(
				dest('src') //編譯後的路徑
			)
	);
}

//監聽檔案變化,自動編譯
function watchCss() {
	const watcher = watch(['src/style/*.less'], buildCss);
	watcher.on('change', function (path, stats) {
		console.log(`File ${path} was changed,running tasks...`);
	});
}

exports.default = buildCss;
exports.watchCss = watchCss;

三.修改package.json

加執行命令

	"scripts": {
		"build": "gulp",
		"watch": "gulp watchCss"
	},

示例:

原始樣式檔案如下:

.hex-login-box {
	width: 625px;
	margin: 0 auto;
}
.logo {
	width: 366px;
	height: 200px;
	margin: 96px auto 0 auto;
	background-image: url(./logo.svg);
	background-size: 100% 100%;
}

.form-wrap {
	margin: 88px auto 0 auto;
	.form-item {
		margin-top: 16px;
	}
	.form-footer {
		margin-top: 72px;
	}
}


.hex-input {
	width: 622px;
	height: 88px;
	box-sizing: border-box;
	line-height: 88px;
	font-family: PingFang SC;
	font-size: 24px;
	font-weight: 400;
	padding-left: 30px;
	color: #bfbfbf;
	border: 1px solid #ccc;
	background: #f6f6f6;
	border-radius: 16px;
}

.hex-button {
	width: 622px;
	height: 96px;
	font-size: 32px;
	color: #ffffff;
	background: #276ef1;
	border-radius: 16px;
	border: none;
	cursor: pointer;
	margin-bottom: 16px;
}

.hex-button-affirm {
	box-shadow: 0px 10px 26px rgba(39, 110, 241, 0.2);
	border: none;
}

.hex-button-cancel {
	color: #276ef1;
	background: #ffffff;
	border: 1px solid #276ef1;
}

執行 yarn run build (其實最終是執行的 gulp buildCss )

生產的檔案如下:

.hex-login-box {
  width: 83.33333vw;
  margin: 0 auto;
}
.logo {
  width: 48.8vw;
  height: 26.66667vw;
  margin: 12.8vw auto 0 auto;
  background-image: url(./logo.svg);
  background-size: 100% 100%;
}
.form-wrap {
  margin: 11.73333vw auto 0 auto;
}
.form-wrap .form-item {
  margin-top: 2.13333vw;
}
.form-wrap .form-footer {
  margin-top: 9.6vw;
}
.hex-input {
  width: 82.93333vw;
  height: 11.73333vw;
  box-sizing: border-box;
  line-height: 11.73333vw;
  font-family: PingFang SC;
  font-size: 3.2vw;
  font-weight: 400;
  padding-left: 4vw;
  color: #bfbfbf;
  border: 1px solid #ccc;
  background: #f6f6f6;
  border-radius: 2.13333vw;
}
.hex-button {
  width: 82.93333vw;
  height: 12.8vw;
  font-size: 4.26667vw;
  color: #ffffff;
  background: #276ef1;
  border-radius: 2.13333vw;
  border: none;
  cursor: pointer;
  margin-bottom: 2.13333vw;
}
.hex-button-affirm {
  box-shadow: 0px 1.33333vw 3.46667vw rgba(39, 110, 241, 0.2);
  border: none;
}
.hex-button-cancel {
  color: #276ef1;
  background: #ffffff;
  border: 1px solid #276ef1;
}

其實這裡重要是動態實現px到vw的轉換工作。

存在的問題

使用vw有一些細節之處還是存在一定的缺陷的。比如當容器使用vw單位,margin採用px單位時,很容易造成整體寬度超過100vw,從而影響佈局效果。對於這個問題,我們可以將margin換成padding,並且配合box-sizing解決。隨著將來瀏覽器或者應用自身的Webview對calc()函式的支援之後,碰到vw和px混合使用的時候,可以結合calc()使用。