京东金融APP 学习笔记

版权声明: https://blog.csdn.net/zgpeterliu/article/details/81365222

1)业务开发流程回顾
2)技术选型分析
3)工程构建安装
4)项目设计以及原理分析

5)首页开发
6)理财开发
7)白条开发
8)众筹开发
9)专题页开发

10)构建工具详解
11)面试进阶

第1章 课程介绍

包括课程概述、课程安排、学习前提等方面的介绍,让同学们对组件化有一个直观的了解。

第2章 环境及知识准备

帮助大家梳理课程要用到的开发环境及知识储备

第3章 业务开发流程与工程构建安装

该章节会快速的讲解各大公司的业务开发流程,包括技术选型、业务开发、测试验证、发布上线等内容,方便大家定位前端开发的角色及注意事项。并帮助大家快速的搭建开发环境,把主要精力放到项目的设计学习上,所有的构建放在最后的章节...

第4章 项目设计与原理分析

该章节根据需求分析详细讲述项目设计方案,CSS模块化设计、JS组件设计、自适应 、SPA设计、构建设计、上线指导等内容,并逐一讲述项目设计方案背后的工作原理理,做到知其然知其所以然。

第5章 京东金融首页

该章节开始实战环节,完成第一个项目的页面,其中还包括公共组件的开发。

第6章 京东金融理财页

该章节是实战的第二个页面,和首页相比组件难度较小,主要包括页面搭建、广告组件(神券满)、轮播图组件、精选推荐组件、广告组件(京东智投)。希望大家可以先主动去练练手,试试能不能1个小时完成该页面的开发。

第7章 京东金融白条页

该章节是实战的第三个页面,难度中等,主要包括轮播图组件、白条福利利组件 更多服务组件。通过这个页面的学习可以将前面的组件化设计方法运用到该页面,举一反三。

第8章 京东金融众筹页

该章节是实战的第四个页面,难度较大,主要包括轮播图组件(纵向)、每日签到组件 、In货推荐组件、更多福利组件,更能彰显组件化抽象设计的威力,希望大家多多思考让自己对组件化方法彻底吸收。

第9章 活动专题页

主要讲述移动Web最常见的专题活动开发方法、难点解决及注意事项。

第10章 上线指导

讲述项目设计如何做到上线,方便大家根据自己业务的架构方案零成本上线迁移。

第11章 工程构建详解

该章节从0讲述如何使用Webpack(v3.10.0)构建自己的项目,摆脱对其他脚手架的依赖,方法和代码同在,艺多不压身,你可以的。

第12章 面试知识点与技巧

做好项目一方面是完成业务开发,提升自己的实力;一方面是让自己在下一次面试积累资本,让职业生涯稳步向前。该章节帮你在“项目面试”中拔得头筹。

第13章 课程总结

对课程整体进行一个总结

css模块化以及模块化设计
组件化设计的灵活
vue相关用法
自动化构建


node版本管理工具:
    nvm----多个node版本的管理
    nvm -ls


git命令:
    git init
        clone
        add *
        push
        commit
        checkout -b xxx
        checkout xxx

webpack
npm scripts ----------任务管理
babel----------Es6必备工具之一

编辑器:
Atom
Eslint---------代码质量规范检查工具


Es6
Sass
Vuejs

业务开发流程:
         技术选型
         业务开发
         测试验证
         发布上线
     
1)技术选型:
       构建工具
       MVVM框架选择
       模块化设计
       自适应方案设计
       代码维护以及复用性设计的思考
    
    构建工具:
            有哪些构建工具:gulp  grunt -----------任务分配和管理 (gulp是流式的)
                            webpack----------------打包管理 
                            fis--------------------百度内部集成的方案 
                            prepack----------------facebook推出的,没有dom和bom
                            rollup-----------------类似webpack功能,其中trill-shirnk编译打包之前可以去掉重复代码
            为什么用构建工具:资源压缩   静态资源替换  模块化处理  编译处理
            我们用哪个构建工具:webpack  
                                npm scripts    -----------也可以做任务管理    
                      
    MVVM框架选择:
            Vuejs
            Reactjs
            Angularjs
            1)团队成员技术背景
            2)生态-----作者对框架维护的热度,文档的详细程度
            3)原理-----框架的原理,性能的影响
            
    模块化设计:
            css模块化 
            js模块化            
            
    自适应方案设计:
            设计稿是一份,设备不是一份的
            写一份代码,自动化适配----构建工具中写
                        
    代码维护以及复用性设计的思考:
            需求变更
            产品迭代
            Bug定位
            新功能开发

2)工程构建:
    下载代码
    安装调试:
               cd JDFinance   
               npm install   
               git checkout setup 
               npm start               
    测试验证:
        是不是安装正确
        ESlint是不是能够检查代码格式
        是不是能够编译Vue ES6
        是不是能够编译scss和css
        修改代码后浏览器能不能自动刷新
        css模块化是不是正确----------------<div :class="$style.home">       <style lang="scss" module>

3)项目设计与原理分析:
        css模块化设计
        js组件设计
        自适应方案设计
        SPA设计
        构建设计
        上线指导

css模块化设计:
    设计原则:
            可复用能继承要完整
            周期性迭代--------------模仿  设计   重构
    设计方法:
            先整体后部分再颗粒化
                         布局-------grid  flex ,决定了怎么写css
                         页面-------模块 
                         功能-------功能组件,比如按钮
                         业务-------继承功能UI,有具体的逻辑,跟业务有耦合了
            先抽象再具体
            
            reset.scss
            layout.scss
            element.scss
            
            global
            scope-----------<style lang="scss" module>
            
js组件设计原则:
    高内聚低耦合-----------抽象一个列表js组件
    周期性迭代-------------    
    设计方法:
            先整体后部分再颗粒化
            尽可能的抽象
            
自适应:
    1、基本概念
            css像素  设备像素  逻辑像素  设备像素比
            viewport
            rem            
    2、工作原理
            利用viewport和设备像素比调整基准像素
            利用px2rem自动转换css单位


    css像素---逻辑像素:height width:20px
    设备像素:硬件相关的,物理像素
    设备像素比:css像素1px对应几个物理像素    

    viewport:
        width = device-width--------------layout viewport等于ideal viewport,可以看到整个页面的内容。手机自动铺满
        height
        initial-scale
        maximum-scale
        minimum-scale
            layout viewport----------页面本来的大小窗口
            visual viewport----------被裁减出来的窗口大小
            ideal viewport-----------手机的宽和高组成的尺寸
            
    rem:------------html根元素的font-size大小
             html font-size    
            利用viewport和设备像素比调整基准像素
        

SPA设计:
    设计意义:
            前后端分离
            减轻服务器压力
            增强用户体验
            Prerender预渲染优化SEO
    工作原理:
            History API------看起来优雅,但是对浏览器有要求
            Hash----------兼容性最好            
    
    History API:
            打开---------入口  打开页面
            历史记录操作单-----------前进  后退  控制
            pushstate----------创建历史记录
            onpopstate---------来响应浏览器的前进后退以及控制事件
                        
    Hash:   
            hashchange---------监听hashchange事件,知道页面的地址发生变化了,然后在事件里面做相应的动作
            location.hash------改变某一个地址的时候,修改这个hash            
        
    应用history方式创建路由:        
    <a class="api a">a.html</a>    
    <a class="api b">b.html</a>    
    //注册路由
    document.querySelectorALl('.api').forEach(item => {
        item.addEventListener('click', (e) => {
            e.prevenbtDefault();-------阻止a标签默认的事件
            let link = item.textContent;
            window.history.pushState({name:'api'}, link, link);------pushState接受三个参数
        }, false)
    });
    //监听路由
    window.addEventListener('popstate', (e)=>{
        console.log({
            location:location.href,
            state:e.state
        });
    }, false)

    应用hash方式创建路由:        
    <a class="hash a">#a.html</a>    
    <a class="hash b">#b.html</a>    
    //注册路由
    document.querySelectorALl('.hash').forEach(item => {
        item.addEventListener('click', (e) => {
            e.prevenbtDefault();-------阻止a标签默认的事件
            let link = item.textContent;
            location.hash = link;
        }, false)
    });
    //监听路由
    window.addEventListener('hashchange', (e)=>{
        console.log({
            location:location.href,
            hash:location.hash
        });
    }, false)    
            
            
构建工具:
        webpack---------配置  安装  plugin
        babel ----------配置  安装  loader  (编译工作)
        dev-server------配置  安装     (热更新 文件额渲染服务)
        
上线指导:
        html 
        css  
        javascript            
            
            

            
            
            
            
            
            
实战开发环节:
        需求分析:
        组件设计: 
                 panel:-----header  body
                 btn
                 slider
                 css模块可以通过抽象组件引入进来的
                 
                 Emmet插件-------快速生成div class id

        vue-awesome-swiper
        
        
        props: {
        cname: {
            type: String,
            default: "",
        },
        options: {
            type: Object,
            default() {------------------定义对象的时候,default(){return{}} -----相当于default: function(){return{}}
                return {
                    autoplay: true,
                    loop: true,
                    pagination: {
                        el: ".swiper-pagination",
                    },
                    notNextTick: false,
                }
            },
        },
        
        <img :src="item.src" alt="">
        
      

        
首页--header组件:
        背景图片----图片尺寸容易控制  可以控制任何位置   可以通过构建工具打包成base64到css中
        &nbsp;-----------空格
        
        css module-----------:class="$style.cname"

         .slider{
            margin-top: 120px;
            img{------------------只对当前引用组件的img有css作用
              width: 100%;
            }
          }

          
          在业务层的组件,完全不用关心css  js,只传送一下数据过去

    新手特权:      
         css核心的是布局 
         先抽象出来布局

         不抽象成组件的原因:
            不是数据驱动的
            结构简单
            出现的次数少

        &:first-child{----------css3高级元素选择器
        }

        避免文字换行溢出:
              white-space: nowrap;
              text-overflow: ellipsis;
              overflow: hidden;

    极速借贷:
    
    所有线的问题-----border  伪元素
        &:after{
          content: " ";
          width: 1px;
          height: 136px;
          display: block;
          position: absolute;--------------纵向线条,没有贯穿,absolute  top  margin-top实现垂直方向居中显示
          top: 50%;
          right: 0;
          margin-top: -68px;
          border-right: 1px solid #eee;
        }
        &:nth-child(2n){
          &:after{
            display: none;
          }
        }

    dl dt dd标签活用-----------如果ul li,那么第一个dt需要用nth-child 或者class区分 
            dt
            nth-child
            .class
            
            
        &:after{
            content: " ";
            display: block;
            width: 100%;
            height: 0px;
            box-sizing: border-box;
            border-bottom: 1px solid #ddd;
            position: relative;------------------content:after底部贯穿线条,提升relative位置,在四个小块中间横向显示
            top: -208px;
        }

新品推荐:

footer:
             .panel{
                @include panel;
                margin-bottom: 100px;---------底部留距离,tabbar,否则有部分内容会被tabbar挡住
            
             &:nth-child(n+3){---------------从第三个元素开始选择
                  padding: 24px 0;
                  height: 38px;
                  line-height: 38px;
                  border-top: 1px solid #ddd;
                }
navBar:                
            .content{
              @include flex(row);
              justify-content: space-around;-----------实现导航栏水平方向均匀分布                
                


                
组件化思想-------抽象到具体

css模块化

sass整合全站的css样式

第6章


第9章:
     活动页:
         .content{--------------外层容器flex布局,实现容器内部元素水平垂直居中
          @include flex;
          justify-content: center;
          align-items: center;
          height: 1136px;
          width: 100%;
              >div{
                background: url(https://img12.360buyimg.com/jrpmobile/jfs/t8956/285/1249806938/50853/8cd3c8f0/59b65f36N05367075.png?) center center no-repeat;
                width: 600px;
                height: 800px;
                background-size: 100% auto;
                margin-top: -400px;-----------在水平垂直居中的前提下,可以灵活的设置位置
              }
                

上线指导:
        生产构建:
               合并 -------style  
                           javascript  
               抽取  ------样式要从javacript中抽取出来 
               压缩  ------js  css都要压缩
               调试--------开启sourceMap
        发布部署:
               提交 -------git提交到远端仓库  
               部署  ------php java从git仓库拉取代码,通过小流量、跨机房、全量部署
               开启gzip压缩  ---开启gzip压缩
               更新CDN       -----不要忘了更新cdn------检查线上cdn源代码是否有更新过来了
       
package.json--------scripts脚本:

https://webpack.docschina.org/guides

webpack压缩  js压缩:uglifyplugin插件
             css压缩:css-loader?minimize----------css-loader的选项minimize:true压缩css


sourceMap----------devtool: 'source-map',   

                    new UglifyJSPlugin({
                    +       sourceMap: true-------------需要加入这一行的
                    +     })

                    
 css: 'vue-style-loader!css-loader!px2rem-loader?remUnit=40&remPrecision=8',----------webpack升级之后-loader需要写全


使用预处理器:
        px2rem功能实现
        
        {
          test: /\.vue$/,
          loader: 'vue-loader',
          options: {--------------------增加options选项来配置预处理器的
            loaders: {
              scss: 'vue-style-loader!css-loader!sass-loader', // <style lang="scss">
              sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax' // <style lang="sass">
            }
          }
        }
        
        
        {------------京东金融项目中有用到两种css 和scss样式语言
          css: 'vue-style-loader!css-loader!px2rem-loader?remUnit=40&remPrecision=8',
          scss: 'vue-style-loader!css-loader!px2rem-loader?remUnit=40&remPrecision=8!sass-loader'
        }

const CleanWebpackPlugin = require('clean-webpack-plugin');-----------给devServer生成的目录定时的清除

css Modules:----------CSS Modules 处理是通过 css-loader。你可以使用 vue-loader 的 cssModules 选项去为 css-loader 添加 query 配置:

                 {
                      test: '\.vue$',
                      loader: 'vue-loader',
                      options: {
                        cssModules: {
                          localIdentName: '[path][name]---[local]---[hash:base64:5]',
                          camelCase: true
                        }
                      }
                    }
        
        
提取css到单个文件:
        构建   vue-loader
 
        const ExtractTextPlugin = require("extract-text-webpack-plugin");

      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: {
          loaders: {
            css: ExtractTextPlugin.extract({
              use: 'css-loader',
              fallback: 'vue-style-loader' // <- 这是vue-loader的依赖,所以如果使用npm3,则不需要显式安装
            -------------------options.use----Loader(s) that should be used for converting the resource to a CSS exporting module (required)
            -------------------options.fallback-----loader(e.g 'style-loader') that should be used when the CSS is not extracted (i.e. in an additional chunk when allChunks: false)
            })
          }
        }
      }
            
      
       plugins: [
            new ExtractTextPlugin("style.css")
          ]
          
        {
          css: 'vue-style-loader!css-loader!px2rem-loader?remUnit=40&remPrecision=8',
          scss: 'vue-style-loader!css-loader!px2rem-loader?remUnit=40&remPrecision=8!sass-loader'
        }----------------------------vue-style-loader的用法发生了变化
        
生产环境下整合成下面这种写法:
        {
          css: ExtractTextPlugin.extract({
              use: 'css-loader?minimize!px2rem-loader?remUnit=40&remPrecision=8', 
              fallback: 'vue-style-loader'
          }),
          scss: ExtractTextPlugin.extract({
              use: 'css-loader?minimize!px2rem-loader?remUnit=40&remPrecision=8!sass-loader', 
              fallback: 'vue-style-loader'
          })
        }
        
        new ExtractTextPlugin("style.css", {ignoreOrder: true}),

DefinePlugin:
        
The DefinePlugin allows you to create global constants which can be configured at compile time. 
This can be useful for allowing different behavior between development builds and release builds.
           
           const webpack = require('webpack');
           
           module.exports = env => {------------根据传进来的参数,运行环境的不同,来构建不同环境下的选项
              if (!env) {
                env = {}
              }
              let plugins=[
                new CleanWebpackPlugin(['dist']),
                new HtmlWebpackPlugin({template: './app/views/index.html'}),
                new webpack.NamedModulesPlugin(),
                new webpack.HotModuleReplacementPlugin()
              ];
              if(env.production){
                plugins.push(
                  new webpack.DefinePlugin({------------给webpack本身修改全局变量
                    'process.env': {
                      NODE_ENV: '"production"'
                    }
                  }),
                  new ExtractTextPlugin("style.css", {ignoreOrder: true}),
                  new UglifyJsPlugin({sourceMap: true})
                )
              }
              return {--------------通过函数,返回对象
                 entry:'',
                 module:{},
                 plugins:'',
                 output:{}
              }
           }

猜你喜欢

转载自blog.csdn.net/zgpeterliu/article/details/81365222