记从无到有的活动页开发-1

1,698 阅读3分钟

写在前面--最近接手了一个活动页,决定采用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我都会新建对应的文件夹,并将与之相关的东西都放到一起。

    与全局相关的样式则放在Global.scss中由App.vue引入,Utils.scss则是用来放一些公用但不公共的样式或方法。另外还有一种方式--将所有的scss文件都import进一个总的scss文件,然后在App.vue中引入这个总的scss文件即可。

舞台搭建完毕

至此,已经基本完成了vue项目的脚手架,我们可以很惬意的往项目里面填肉了。下一篇,将会结合具体开发的页面,记录一下途中遇到的问题和填过的坑。

往期文章