眾所周知Rust的學習曲線極為陡峭,學習過程中挫敗感極強,像筆者這樣有十幾年開發經驗的人也要經常需要好幾天時間才能長度搞清楚一個小小的細節問題,具體可以參見前文《從內存布局上看,Rust的胖指針到底胖在棧上還是胖在堆上》。因此在學習掌握Rust的過程中還是需要一些沒那么硬核的知識點進行穿插、點綴的。
Nicolas Frankel一直是我非常關注的Rust技術專欄作者之一,近期我看到他的一篇有關于Rust與JS結合搭建Serverless WebAssembly的文章,立刻感覺眼前一亮,這篇文章當中沒有那些繁鎖的權限傳遞機制、智能指針等項目,只要跟著作者的代碼樣例進行模仿就行了,而且這方面的知識也比較實用,不失為一篇在學習中途中可以放松一下轉換心情的好文章,下面就帶大家奇文共賞。
我們知道JavaScript是前端方面唯一個算得上是通用的語言,各種前端流行框架本質上都是基于JavaScript。雖然為前端生的JavaScript存在很多儲如性能、并發等方面的先天不足,但是也應該看到JavaScript 開發者社群還在大幅增長,圍繞前端 JavaScript 的生態也是日益繁榮,而且前端技術變化很快,幾年前還稱霸一時的Flash幾乎直線墜落,完全被H5干掉,從NodeJS、DENO到Vue.js,各種新框架也是不斷涌現,也讓大家應接不暇,可以說JS體系的繁榮是有目共睹的。
雖然有關語言優劣的爭論大多是沒有作何實際意義的,但不可否認的是JavaScript往往處在編程語言鄙視鏈的底端,很多程序員都認為JS之所以能幸存下來,是因為它將執行腳本代碼的責任從服務器轉移到客戶端,這樣就減輕了服務器上的很大壓力。不過相對而言,客戶端的壓力卻因此大大增加了,想提升上網體驗前端程序員幾乎只能建議用戶去購買功能更強大而且價格昂貴的手機、PAD或者PC。而想要優化JavaScript 引擎似乎還得靠Rust才能做到。在介紹下面的方案之前,我們先來認識一下WebAssembly。
WebAssembly(縮寫為 Wasm)是一種用于基于堆棧的虛擬機的二進制指令格式。Wasm 被設計為編程語言的可移植編譯目標,支持在 Web 上部署客戶端和服務器應用程序。
總得來說Wasm并非要取代JavaScript,而是指在提高前后端交互的整體性能。盡管Rust多用于后端,但它的特性確實有助于提升WebAssembly的編譯、啟動及運行速度,下面我們就一起來感受一下Rust+Wasm的強大威力。
我們第一個步驟側重于讓大家了解設置方法,這是一個Ctrl+C、Ctrl+V式復制粘貼項目。這個項目利用一個高效的Cargo 插件cargo-generate來提升項目管理效率,它允許使用現有的 Git 存儲庫作為模板來創建新項目。在本例中,模板是一個待編譯的 Wasm Rust項目。具體項目的樹形結構如下:
這是非常典型的Rust項目結構?,F在我們來看一下Cargo.toml文件。
[package]
name = "wasm-game-of-life"
version = "0.1.0"
authors = ["Nicolas Frankel <nicolas@frankel.ch>"]
edition = "2018"
[lib]
crate-type = ["cdylib", "rlib"]
[features]
default = ["console_error_panic_hook"]
[dependencies]
wasm-bindgen = "0.2.63"
# Rest of the file omitted for clarity purposes
這里Cargo.toml其實發揮了前端項目中pom.xml的作用,這里列出有關包、依賴項、編譯提示等的元信息,并定義與Wasm的依賴關系。當然截止目前這個項目還不是很有趣,不過我們會慢慢來建立一個項目,使Wasm的Rust代碼能夠高效交互。
接下來讓運行命令:
npm init wasm-app www
你會看到以下輸出結構:
wasm-game-of-life/
└── www/
├── package.json
├── webpack.config.js
├── index.js
├── bootstrap.js
└── index.html
其中webpack.config.js是調用 Wasm 代碼的入口點,index.js是異步加載器包裝器。進行完上述步驟后,接下來只要我們完成以下四步,就可以執行整個Wasm代碼鏈。
將 Rust 代碼編譯為 Wasm
生成 JavaScript 適配器代碼
安裝NPM 依賴項 npm install
執行npm run start
瀏覽到http://localhost:8080會顯示一條簡單的alert()消息。
在帶著廣大讀者們重新做一遍教程之前,筆者這里先給出一些有意義的結論。也就是Wsam+Rust的結合過程中,可以歸結為以下三步:
從 JavaScript 調用 Rust
從 Rust 調用 JavaScript
從 Rust 調用瀏覽器 API
好接下來我們就一點一點學習這些步驟,要從 JavaScript 調用 Rust,需要將 Rust 代碼編譯為 Wasm 并提供瘦 JavaScript 包裝器。在Rust方面具體方案如下:
pub fn foo() {
// do something
}
在 JavaScript 代碼方面示例如下:
import * as wasm from "hello-wasm-pack";
wasm.foo();
將hello-wasm-pack包中的所有內容導入wasm命名空間之后,用戶就可以調用foo()函數了。
從 Rust 調用 JavaScript
Rust 調用 JavaScript 函數時需要通過extern關鍵字聲明使用外部函數接口,具體如下:
extern "C" {
fn random() -> f64;
}
fn random_boolean() -> bool {
random() < 0.5
}
注意雖然這里關鍵字是extern "C",但這并不是 C 代碼,Rust中這就是正確的語法,因此我們只要用它就可以了。接下來需要進行有關js沙箱(js-sys crate)的設置工作,如果要詳細了解相關內容,可以參考以下鏈接:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects
接下來需要將js-sys添加到cargo.toml當中,具體如下::
Cargo.toml
[dependencies]
js-sys = { version = "0.3.50", optional = true }
[features]
default = ["js-sys"]
上述配置將允許以下代碼在js沙箱中使用:
use js_sys::Math;
#[wasm_bindgen]
fn random_boolean() -> bool {
Math::random() < 0.5
}
上述代碼中的Math.random()語句會在在運行時實現由rust調JavaScript的目標。
當然只是調用JavaScript還是不夠的,因為很多客戶端API,如console.log(),需要調用瀏覽器API。
下面是配置方案:
Cargo.toml
[dependencies]
web-sys = { version = "0.3", features = ["console"] }
配置完成后我們就可以通過以下樣例來調用瀏覽器API:
wasm.rs
extern crate web_sys;
:console; :
#[wasm_bindgen]
impl Foo {
pub fn new() -> Foo {
utils::set_panic_hook();
Universe {}
}
pub fn log(&self) {
console::log_1("Hello from console".into());
}
}
我們在重復一下之前的要點,在前端使用Rust 的三大要決分別是:從 JavaScript 調用 Rust,從 Rust 調用 JavaScript,從 Rust 調用瀏覽器 API。
原文地址:https://blog.frankel.ch/start-rust/5/
源碼地址:https://github.com/ajavageek/rust-game-of-life
聲明:本文由CSDN翻譯,轉載請注明來源。
當涉及屏幕適配方案時,我們常常被眾多選擇所困擾,如postcss-pxtorem、postcss-px2rem、px2rem-loader、postcss-plugin-px2rem等。然而,在實際測試中,由于不同的Vue和Webpack版本,很多這些方式已經無法使用,反而帶來了更多麻煩。
為了盡快解決問題,我們應該始終以解決問題為導向,首先采用那些已經獲得驗證并能產生效果的方法。對于上述列舉的方案,雖然沒有一一測試過,但我們需要明確的是,抓住解決問題的關鍵。
針對移動端和PC端適配,我建議將兩者進行拆分并進行工程化配置,以避免整體框架調整后在某些頁面上出現輕微不協調。在某些情況下,你可能會注意到筆記本電腦上顯示比例縮放后的細微差異,這可以通過插入【整體縮放自適應解決方案(阿里團隊高清方案)的JS代碼】來解決。
viewport即視窗、視口,用于顯示網頁部分的區域,在PC端視口即是瀏覽器窗口區域,在移動端,為了讓頁面展示更多的內容,視窗的寬度默認不為設備的寬度,在移動端視窗有三個概念:布局視窗、視覺視窗、理想視窗。
viewport詳細設置:
移動端默認會縮放大尺寸的頁面的,當我們把上述代碼去掉之后,就會隨著移動端縮放的比例走,而且還可以自由放大。
方案統計:
代碼原理:
// 僅在移動端時候生效,或者瀏覽器手機模式
// 整體縮放自適應解決方案(阿里團隊高清方案) 淘寶m端使用的解決方案
! function (e) {
function t(a) {
if (i[a]) return i[a].exports;
var n = i[a] = {
exports: {},
id: a,
loaded: !1
};
return e[a].call(n.exports, n, n.exports, t), n.loaded = !0, n.exports
}
var i = {};
return t.m = e, t.c = i, t.p = "", t(0)
}([function (e, t) {
"use strict";
Object.defineProperty(t, "__esModule", {
value: !0
});
var i = window;
t["default"] = i.flex = function (e, t) {
var a = e || 100,
n = t || 1,
r = i.document,
o = navigator.userAgent,
d = o.match(/Android[\S\s]+AppleWebkit/(\d{3})/i),
l = o.match(/U3/((\d+|.){5,})/i),
c = l && parseInt(l[1].split(".").join(""), 10) >= 80,
p = navigator.appVersion.match(/(iphone|ipad|ipod)/gi),
s = i.devicePixelRatio || 1;
p || d && d[1] > 534 || c || (s = 1);
var u = 1 / s,
m = r.querySelector('meta[name="viewport"]');
m || (m = r.createElement("meta"), m.setAttribute("name", "viewport"), r.head.appendChild(m)), m
.setAttribute("content", "width=device-width,user-scalable=no,initial-scale=" + u + ",maximum-scale=" +
u + ",minimum-scale=" + u), r.documentElement.style.fontSize = a / 2 * s * n + "px"
}, e.exports = t["default"]
}]);
flex(100, 1);
// 高清方案默認1rem=100px,那么 btn的寬度就設置為:)
.btn {
width:0.8rem
height:1.2rem
}
【7】 移動端開發自適應解決方案(阿里團隊高清方案)
同時兼任pc和移動適配
通過配置兩套不同路由和判斷是否是移動端實現
核心代碼:router.addRoute(isMobile() ? mobileRoutes[1] : pcRoutes[1]);(區分路由)
搭配工程化,可以參考第二章【PC端適配方案】
npm i postcss-pxtorem --save-dev
?
//使用postcss-pxtorem
module.exports = {
lintOnSave:true,
css:{
loaderOptions:{
postcss:[
require('postcss-pxtorem')({
rootValue:16,//根元素字體大小
unitPrecision:5, //允許rem單位增長的十進制數字
replace:true, //替換包含rems的規則,而不添加后備
mediaQuery:false, //允許在媒體查詢中轉換px
minPixelValue:0, //設置要替換的最小像素值
selectorBlackList:[], //忽略轉換正則匹配項
propList:['*'], //可以從px轉換為rem的屬性,匹配正則
exclude:/node_modules/i 要忽略并保留為px的文件路徑
}),
]
}
}
}
vue項目使用element-ui框架Rem適配(postcss-pxtorem、amfe-flexible),自動轉換px為rem,解決響應式問題
1366 * 768 : 普通液晶顯示器 1920 * 1080: 高清液晶顯示器 2560 * 1440: 2K高清顯示器 4096 * 2160: 4K高清顯示器 1280 * 720: 筆記本(1920*1080分辨率下系統默認推薦150%縮放比產生的尺寸)
大屏數據可視化項目通常用于放在電視或廣告屏上展示用,而不允許出現滾動條
設計稿按照1920*1080的分辨率,16:9的比例設計, 實際開發中,document窗口不足16:9(高度減掉頂部tab及導航欄,地址欄等) 不同分辨率:實際應用場景中,顯示場景不同,不能固定寫死px單位 不同比例:不同的顯示器寬高比與設計稿不一致
rem是CSS3新增的相對長度單位,是指相對于根元素html的font-size計算值的大小。簡單可理解為屏幕寬度的百分比。 但是,項目中常見尺寸繪制采用的均是px,要改用rem一時半會緩不過來,而且可能還要換算轉換,所以使用rem還是比較麻煩的,但是,我們可以通過插件,能夠將項目中的px轉換為rem,還可以自定義基數。
npm install amfe-flexible // CSS單位自適應轉換插件 負責更改根font-size
npm install postcss-pxtorem@^5.1.1 // 如果版本過高可以降版本下載5.1.1版本 負責將px轉成rem
// 用途:echarts字體適配
/**
* echarts字體自適應
* @param {*} font 字號大小
*/
export function echartGetFontSize(font) {
let docEl = document.documentElement,
clientWidth =
window.innerWidth ||
document.documentElement.clientWidth ||
document.body.clientWidth;
if (!clientWidth) return;
let fontSize = clientWidth / 1920;
return font * fontSize;
}
由于 viewport 單位得到眾多瀏覽器的兼容,lib-flexible 這個過渡方案已經可以放棄使用,不管是現在的版本還是以前的版本,都存有一定的問題。建議大家開始使用 viewport 來替代此方。(待考證?)
amfe-flexible是lib-flexible的升級版
flexible就是根據不同的屏幕算出html的font-size,通過js來動態寫meta標簽
實上他做了這幾樣事情:
在main.js中引入amfe-flexible
import "amfe-flexible"
amfe-flexible 等價代碼
// import '@/utils/rem.js'
?
// 在utils文件夾下創建rem.js
// 設置 rem 函數
function setRem() {
// 1920 默認大小16px; 1920px = 120rem ;每個元素px基礎上/16
const screenWidth = 1920
const scale = screenWidth / 16
const htmlWidth = document.documentElement.clientWidth || document.body.clientWidth
// 得到html的Dom元素
const htmlDom = document.getElementsByTagName('html')[0]
// 設置根元素字體大小
htmlDom.style.fontSize = htmlWidth / scale + 'px'
}
// 初始化
setRem()
// 改變窗口大小時重新設置 rem
window.onresize = function() {
setRem()
}
配置postcss-pxtorem ,可在vue.config.js、postcsssrc.js、postcss.config.js、其中之一配置,權重從左到右降低,沒有則新建文件,只需要設置其中一個即可.
/***
注意點:
(1)rootValue根據設計稿寬度除以10進行設置,這邊假設設計稿為1920,即rootValue設為192;
(2)propList是設置需要轉換的屬性,這邊*為所有都進行轉換。
***/
module.exports=function(){
devServer:{
port:3000,
open:true
},
//rem配置
css: {
loaderOptions: {
postcss: {
plugins: [
require('postcss-pxtorem')({
rootValue: 192, //根元素字體大小
propList: ['*'], //可以從px轉換為rem的屬性,匹配正則
// unitPrecision:5, //允許rem單位增長的十進制數字
// replace:true, //替換包含rems的規則,而不添加后備
// mediaQuery:false, //允許在媒體查詢中轉換px
// minPixelValue:0, //設置要替換的最小像素值
// selectorBlackList:[], //忽略轉換正則匹配項
// exclude:/node_modules/i 要忽略并保留為px的文件路徑
})
]
}
}
},
}
// 效果展示 在html上增加根font-size
<html lang="en” style="font-size: 192px;class="light-themes">
對于行內樣式,阿里手淘并不能將px轉rem,所以對于需要自適應的樣式,如font-size、width、height等請不要寫在行內。同理,對于不需要轉化的樣式可以寫在行內,或者使用PX(大寫)作為單位。
暫未找到可以轉行內rem的插件,可根據下面地址的方式自己實現(未驗證是否可行)。blog.csdn.net/weixin_3961…
我們都知道chrome的最小顯示的字體是12px,如果字體用rem,計算出來小于12px,那么就也會以12px顯示,而且我們不希望出現13px或者15px這樣的奇葩尺寸,所以字體最好是用PX(大寫)來表示,至于適應,我們可以寫媒體查詢。
.item {
border-bottom: 1PX #8d8d8d dashed;
font-size: 12PX;
line-height: 16PX;
@media screen and (min-width: 576PX) {
font-size: 14PX;
line-height: 18PX;
}
@media screen and (min-width: 768PX) {
font-size: 16PX;
line-height: 28PX;
}
@media screen and (min-width: 992PX) {
font-size: 16PX;
line-height: 32PX;
}
@media screen and (min-width: 1200PX) {
font-size: 18PX;
line-height: 64PX;
}
}
?
PC端響應式媒體斷點:
?
```css
@media (min-width: 1024px){
body{font-size: 18px}
} /*>=1024的設備*/
?
@media (min-width: 1100px) {
body{font-size: 20px}
} /*>=1100的設備*/
@media (min-width: 1280px) {
body{font-size: 22px;}
} /*>=1280的設備*/
?
@media (min-width: 1366px) {
body{font-size: 24px;}
}
?
@media (min-width: 1440px) {
body{font-size: 25px !important;}
}
?
@media (min-width: 1680px) {
body{font-size: 28px;}
}
@media (min-width: 1920px) {
body{font-size: 33px;}
}
```
?
?
已測試屏幕尺寸:1920*1080 、1366 * 768
問題:屏幕縮小,網頁縮放,效果與原1920*1080不一致
// 僅在移動端時候生效,或者瀏覽器手機模式
// 整體縮放自適應解決方案(阿里團隊高清方案)
! function (e) {
function t(a) {
if (i[a]) return i[a].exports;
var n = i[a] = {
exports: {},
id: a,
loaded: !1
};
return e[a].call(n.exports, n, n.exports, t), n.loaded = !0, n.exports
}
var i = {};
return t.m = e, t.c = i, t.p = "", t(0)
}([function (e, t) {
"use strict";
Object.defineProperty(t, "__esModule", {
value: !0
});
var i = window;
t["default"] = i.flex = function (e, t) {
var a = e || 100,
n = t || 1,
r = i.document,
o = navigator.userAgent,
d = o.match(/Android[\S\s]+AppleWebkit/(\d{3})/i),
l = o.match(/U3/((\d+|.){5,})/i),
c = l && parseInt(l[1].split(".").join(""), 10) >= 80,
p = navigator.appVersion.match(/(iphone|ipad|ipod)/gi),
s = i.devicePixelRatio || 1;
p || d && d[1] > 534 || c || (s = 1);
var u = 1 / s,
m = r.querySelector('meta[name="viewport"]');
m || (m = r.createElement("meta"), m.setAttribute("name", "viewport"), r.head.appendChild(m)), m
.setAttribute("content", "width=device-width,user-scalable=no,initial-scale=" + u + ",maximum-scale=" +
u + ",minimum-scale=" + u), r.documentElement.style.fontSize = a / 2 * s * n + "px"
}, e.exports = t["default"]
}]);
flex(100, 1);
“node-sass”: “^4.9.0”,
“sass-loader”: “^7.1.0”
作者:幸運_
鏈接:https://juejin.cn/post/7278646930174165050
著就能變瘦變白,是所有減肥/美白人群的終極夢想,于是很多人紛紛投向了醫療美容。
為了滿足廣大愛美人士的需求,兩款神奇的產品誕生了——美白針、溶脂針。
其實這兩種產品都是不合法的醫美項目,在我們國家都沒有被批準。
如果你也種草了/做過這兩個項目,請一定要認真看這篇文章。
動圖來源于千庫網
先來說說「美白針」。
「美白針」是通過靜脈注射藥物,達到美白效果的一種手段。
它的主要成分是傳明酸(氨甲環酸)、維C、谷胱甘肽等, 這幾個成分在化妝品里經常見到,都有一定美白作用。
那是不是注射的效果更好呢?
效果好不好不知道,風險是很大的。
首先「美白針」并不是一種藥物,而是幾種不同的針劑的組合,加在一起靜脈注射。
這幾種針劑的配比是廠家自己配制的,并沒有一個標準配比。
這些藥物經血流向多個組織器官,必然會有藥物的主要適應癥效果產生,比如凝血。
在無凝血性障礙的情況下,注射抗纖溶藥物,是不明智的。
其次,國家批準這些藥物(傳明酸、谷胱甘肽),并不是用于美白,而是用來治療其他疾病的。
比如傳明酸是用來凝血的,而谷胱甘肽在臨床上是用來保肝的。
而商家并沒有按照藥品上的指示用藥,而是根據自己的理解,用于治療美白。
更有甚者為了達到美白效果,會加大劑量,可能會損傷腎功能,帶來很大的副作用。
要知道其實不光是中國沒批準這類醫美項目,美國FDA也沒批準過注射用的美白產品。
再來說說「溶脂針」。
「溶脂針」是注射入人體后,讓臉、下巴、腿變瘦的針劑。
「溶脂針」的主要成分是磷脂酰膽堿(ppc)、利多卡因(麻醉劑)、腎上腺素及生理鹽水。
主要原理是通過磷脂酰膽堿(ppc)的乳化作用將局部脂肪乳化為小顆粒,用膨脹液輔助,加快脂肪從淋巴管代謝,起到溶脂的作用。
但溶脂針里的藥物成分利多卡因、腎上腺素等如果被血液系統吸收后,會給身體帶來不同程度的副作用,比如頭暈、惡心、心動過速、呼吸困難、血壓下降等。
當麻醉劑用量過大時,也存在生命危險。
而且溶脂針沒有有效地降低脂肪細胞數量,如果不控制飲食的話,還是會反彈的。
動圖來源于soogif
在國外,有部分品牌的溶脂針獲得了批文,可以注射使用(例如祛除雙下巴),但它在成分、治療效果、安全方面還存在很多問題。
在國內,雖然有部分品牌拿到了批文,不過是妝字號的。
也就是說,在國內溶脂針可以外用涂抹皮膚,但用于皮下注射是不合法的,在正規的醫美機構是沒有的。
動圖來源于soogif
雖然美白針和溶脂針,在國內都是不合法的醫美項目,但是在醫美網站上還是能看到它們的身影。
希望有關部門加強監管,也希望各位愛美人士一定要慎重。
愛美沒有錯,人人都喜歡追求美。
但如果你想去做醫美項目,一定要選擇正規的醫療機構和執業醫師,切記要看看有沒有資質證明,
遠離那些來源不明「三無產品」。
畢竟臉只有一張,仙女們請慎重選擇呀~
別忘了轉告自己最好的小姐妹,一起避雷,一起變美。
參考資料:
1.上海衛健委,滬衛監部門加強醫療美容領域監管!來看警示案例http://wsjkw.sh.gov.cn/gzdt1/20200708/1bcd29f7cfa641979660a4f92520ab7a.html
2.《每周質量報告》 20131201黑心美白針。http://tv.cctv.com/2013/12/01/VIDE1385876522401836.shtml
*請認真填寫需求信息,我們會在24小時內與您取得聯系。