記從無到有的活動頁開發-1

mykurisu發表於2018-01-12

寫在前面--最近接手了一個活動頁,決定採用Vue來進行開發,不再與主站的React相關聯,所以我也就有機會可以從頭開始,一步一步的搭建整個專案並且自己決定技術棧。反正,就是很爽~

關於Vue我感覺不需要再做介紹了,在掘金隨便一搜都有一堆,不過如果大家實在沒聽說過,我還是十分建議直接進入Vue的官方文件進行閱讀。

專案背景

最近,接了一個活--一個完全獨立的活動頁開發,由於它跟公司原有的專案(基於React)幾乎完全沒有依賴關係,所以我決定採用Vue來開發這次的需求。前端專案的技術框架初步定為--Vue/Vue-router/axios/sass/webpack。看到vue和webpack相信大家一下就能想到vue-cli吧,對的,我們這次專案選用了vue-cli-webpack作為腳手架。

vue-cli:居家必備

我們假設vue的起手難度是10個難度級別,但是當我們使用了vue-cli之後,我們會發現這個難度就變成了1個難度級別,(好像我們的施法前後搖都被取消了一樣)安裝好vue-cli之後我們就可以直接開始我們的生產了,無論是vue亦或是webpack的配置都不需要我們理會,並且還能夠使用vue-template來加快開發速度。那麼讓我們開始搭建我們的腳手架吧--

$ npm install -g vue-cli

$ vue init webpack kurisu //'webpack'指定了我們希望專案是使用webpack進行打包的
$ cd kurisu
$ npm install
$ npm run dev
複製程式碼

整個流程就是這麼簡單,前提是你需要安裝Node(6.x版本以上)以及NPM(3.0版本以上)。現在我們有了真正意義上的腳手架了,接下來就要著手往上堆東西了。

我是誰?我在哪?我開發什麼?我需要什麼?

在專案伊始,相信大家都遇到過這個問題,我們所開發的專案到底需要怎麼開發、它需要什麼工具、或是有什麼能夠為它所用。

這回我需要開發的是一個移動端的活動頁,移動端移動端,自然就少不了對螢幕的適配啦。以切圖半年的經驗,我選擇rem作為頁面開發的單位,其實就是借鑑了淘寶flexible的那一套。既然用到了這個,那麼css的預編譯器就少不了了,這裡選擇了之前一直都在用的scss,但是最近聽說stylus也不錯,小糾結了一會,最終還是選擇現在看來開發效率最高的scss。

好了,回看上面那段話,好像已經給自己挖了不少坑了,讓我們一個個來填。

  • 移動端Html

    關於移動端的html要說的不多,最重要的這句在就好了--

        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"/>
    複製程式碼
  • Rem佈局

    Rem是啥?簡單來說是css中的一個單位,以html的font-size作為單位的標準也就是說

    html {
        font-size: 100px;
    }
    複製程式碼

    此時1rem也就等於100px,嗯嗯這些我都懂,但是他跟移動端開發有什麼必然關係嗎?可以說有也可以說無,用了rem作為開發單位可以提升開發效率,降低視覺稿還原難度,也能增強頁面在不同螢幕上的適應能力。 下面是在專案中的Global.scss的配置--

    html {
        font-size: calc(100vw/7.5);
        /*有了這一行就代表html的font-size是動態計算的,它隨著我們螢幕的大小(100vw)變化而變化*/
    }
    複製程式碼

    那麼其中的7.5是什麼呢?其實是這樣的--100vw/750px,為什麼是750px,因為這是標準iPhone7尺寸的兩倍也就是俗稱的二倍圖,這樣處理之後1rem就等於iPhone7手機頁面中的100px,那為什麼要除7.5呢?個人認為是為了方便書寫。

    @function px2rem($n) {
        @return $n/100*1rem
    }
    複製程式碼

    定義了這一個方法之後,我們想做設計稿(二倍圖)中一個100x100px的正方形時可以這麼寫:

    .somediv {
        width: px2rem(100);
        height: px2rem(100);
        /*px2rem(100) ==> 375px螢幕中的50px*/
    }
    複製程式碼

    不知道大家發現沒有,這就代表著我們可以完全照搬設計稿中的所有引數,並且基本可以忽略不同尺寸螢幕的適配情況,因為rem的基礎單位是會隨著螢幕尺寸變化而變化的,但是有一點可能有問題,那就是Retina屏的精度問題關於這裡的適配大家可以去尋找相關的博文檢視一下,如果要細講的話可能就偏題了。

  • SCSS配置

    說了這麼多次scss,好像還沒講應該怎麼將scss接入webpack中。

    首先把相關的依賴裝好--

    (c)npm install node-sass --save-dev  //安裝node-sass
    (c)npm install sass-loader --save-dev  //安裝sass-loader
    //本來應該還要裝一個style-loader的但是一般我們用vue-cli之後都是有vue-style-loader的所以就不需要再折騰了。
    複製程式碼

    緊接著就配置一下我們的webpack.base.conf.js

    module: {
        rules: [
            ...(config.dev.useEslint ? [createLintingRule()] : []),
            {
                test: /\.vue$/,
                loader: 'vue-loader',
                options: vueLoaderConfig
            },
            {
                test: /\.js$/,
                loader: 'babel-loader',
                include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
            },
            {
                test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
                loader: 'url-loader',
                options: {
                    limit: 10000,
                    name: utils.assetsPath('img/[name].[hash:7].[ext]')
                }
            },
            {
                test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
                loader: 'url-loader',
                options: {
                    limit: 10000,
                    name: utils.assetsPath('media/[name].[hash:7].[ext]')
                }
            },
            {
                test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
                loader: 'url-loader',
                options: {
                    limit: 10000,
                    name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
                }
            },
            //新增下面這一段即可,讓webpack使用相關的loader去解析scss字尾的檔案
            {
                test: /\.scss$/,
                loaders: ["style", "css", "sass"]
            }
        ]
    }
    複製程式碼

    這樣就完成了在vue專案中引用scss的需求啦,還有一點需要注意的是該怎麼在vue-template中引用,這裡其實有幾種不同的引用方法,就先介紹一下我的引用方式--

    <style lang="scss" scoped>
        @import "./Index.scss";
    </style>
    複製程式碼

    個人傾向於一一對應的引用模式,每一個page我都會新建對應的資料夾,並將與之相關的東西都放到一起。

    記從無到有的活動頁開發-1

    與全域性相關的樣式則放在Global.scss中由App.vue引入,Utils.scss則是用來放一些公用但不公共的樣式或方法。另外還有一種方式--將所有的scss檔案都import進一個總的scss檔案,然後在App.vue中引入這個總的scss檔案即可。

舞臺搭建完畢

至此,已經基本完成了vue專案的腳手架,我們可以很愜意的往專案裡面填肉了。下一篇,將會結合具體開發的頁面,記錄一下途中遇到的問題和填過的坑。

往期文章

記從無到有的活動頁開發-1

相關文章