我的大前端之旅

栏目: JavaScript · 发布时间: 6年前

内容简介:很荣幸,4月份我通过了高德地图的面试,加入了阿里大家庭。这段时间一直在忙着适应新的工作环境,学习新的技术栈,所以没有输出文章(PS:其实是懒)。先明确一下写这篇文章的目的,相信这一点非常重要,进入一个新的领域时总是要努力迈过最基本的门槛的。对于刚进入前端领域的客户端小伙伴们来说,ES6的基本语法就是大前端的“门槛”。入门时建议看下阮一峰的《ECMAScript 6 入门》,这本书是开源的,可以在线看也可以买纸质版的。个人不建议入门时就看《JavaScript 高级程序设计 》等进阶的书,毕竟路要一步一步走

半年没有更新文章了,甚是惭愧

很荣幸,4月份我通过了高德地图的面试,加入了阿里大家庭。这段时间一直在忙着适应新的工作环境,学习新的技术栈,所以没有输出文章(PS:其实是懒)。

先明确一下写这篇文章的目的,相信 大前端 这个词大家都不陌生了。这个技术迭代越来越快的时代,市场对工程师的技术素质提出了新的要求。如果客户端的小伙伴只知道画界面,机械的调用各种Utils拉接口、填充数据的话一定会被市场淘汰。只有 拥抱变化,认清自己 才能立于不败之地。当前客户端最火的技术就是类RN开发了,想要学这块的技术就必须对JS有一定的理解。从广义的角度来说学好了JS就可以玩Node了,Node这个神器下可搞爬虫,上可做服务,可谓全栈必备。所以重点就来了,搞客户端的同学怎样快速入门JS呢?这篇文章就是分享一下我的转型经验。

2.怎样快速入门JS呢?

2.1 补充必要的基础知识

这一点非常重要,进入一个新的领域时总是要努力迈过最基本的门槛的。对于刚进入前端领域的客户端小伙伴们来说,ES6的基本语法就是大前端的“门槛”。入门时建议看下阮一峰的《ECMAScript 6 入门》,这本书是开源的,可以在线看也可以买纸质版的。个人不建议入门时就看《JavaScript 高级程序设计 》等进阶的书,毕竟路要一步一步走,刚开始识字的时候看《新华字典》不仅吸收不到营养还容易打击自己学习的积极性。

那基础知识要补充到什么样的程度呢? 对于普通的开发者来讲,第一阶段知道这些足矣:Map、Set、Array的用法,以及什么是Promise、Generator。

2.2 找到可以让自己亢奋的技术点

这一条因人而异,相信每个工程师对技术方向的追求都不一样。有人热衷于前端比较酷炫的动画效果、有人热衷于算法... 而我对爬虫情有独钟。

我对自己的技术定位是全栈,所以一直想独立搞一个完整的项目(毕竟很多坑是需要亲自趟一下才知道水有多深),这套系统应该包含 Service(DB)、小程序、客户端(类RN开发)、爬虫系统。不管什么样的项目,总是需要数据来填充的,所以学习爬虫是升级打怪的第一步。

我的大前端之旅
那怎么快速搞定这一群拦路虎呢?学Node,当然学习Node的前提是对JS有了基本的了解。非常好用的 cherrio

就是Node的一个模块。

2.3 由点到面发散自己的知识

接下来一起看看我是怎么通过学爬虫来加深对ES6的理解的。

2.3.1 掌握最基本的API

这里有份cherrio的 中文文档 ,3-4小时就可以通读一遍,方便接下来搞事情。我的经验学新技术一定要动手写出来,马上观花还不如去打一局农药。其中 选择器 一栏值得重点关注一下,这块是接下来实战的理论依据。

2.3.2 实战-爬取“电影天堂”的数据

1. 案例一

电影天堂官网地址:www.dytt8.net/ ,接下来我们练习爬取首页左侧栏「最新发布168部影视」的电影数据。

我的大前端之旅
  • 分析页面元素打开chrome的开发者工具,动动你的小手找到我们想要抓取的这块div。如下图: 通过分析,我们知道这是一个class为co_content2的div,它的内部包含着「ul」标签,「ul」标签内部则是我们希望抓取的「a」标签。
我的大前端之旅
  • 开始动手写抓取代码,经过2.3.1的学习,可以轻而易举的写出爬虫代码。
//开始爬取首页
function getHomePageResource(){
    let resultArray = [];
    superagent.get("http://www.dytt8.net/")
        .charset('gb2312') //解决编码问题
        .end(function (error, data) {
            if (error) {
                console.log("error exception occured !");
                return ;
            }
            let $ = cheerio.load(data.text);    //注意传递的是data.text而不是data本身
            let result = $('.co_content2 ul a');
            let length = result.length;
            for(let i=1;i<length;i++){
                let text = result.eq(i).text();
                let href = result.eq(i).attr('href');
                let obj = {'名称':text,'链接':'http://www.dytt8.net'+href};
                resultArray.push(obj)
            }
             console.log(JSON.stringify(resultArray));
        });
}
复制代码

注意这里用到了Node的另外一个模块superagent( 这是nodejs里一个非常方便的客户端请求代理模块),他的作用是把页面的源数据拉下来交给cherrio进行拆分。执行了上述代码,Node会用Log输出一个数组,这个数组就是我们想要的数据(代码写的比较烂哈,大家凑合着看~)。

2. 案例二

爬取首页「迅雷电影资源」的数据

我的大前端之旅
步骤跟 案例一

是一样的,这里直接贴代码。

function getXLResource(){
    //开始爬去迅雷电影资源
    superagent.get("http://www.dytt8.net/")
        .charset('gb2312') //解决编码问题
        .end(function (error, data) {
            if (error) {
                console.log("error exception occured !");
                return next(error);
            }
            let $ = cheerio.load(data.text);    //注意传递的是data.text而不是data本身
            let result = $('.co_area2 .co_content8 ul table tbody').eq(1);
            let length = result.children().length;
            for(let i=0;i<length;i++){
                let text = result.children().eq(i).children().eq(0).children().eq(1).text();
                let href = result.children().eq(i).children().eq(0).children().eq(1).attr('href');
                console.log(text,'http://www.dytt8.net'+href);
            }
        });
}
复制代码

2.3.3 进阶——发散自己的知识面

经过 2.3.2 的实战,最起码的加深了对这些知识点的用法

  • 函数的调用
  • Array Set Map等数据类型
  • for等循环语句
  • Object
  • 其他...

2.1 章节时,提到了Promise Generator。很多小伙伴一定会看的一脸懵逼。

我的大前端之旅
接下来,我们使用Promise对上述的 案例一

进行重构,只求能多增加一点对Promise的认识。

2.3.2.1 使用Promise重构

先来温习一下Promise的基础知识。 简单来说,Promise是来解决回掉函数嵌套太多的问题的。 直接贴代码:

/**
 * 使用Promise重构
 */
function getHomePageResourceByPromise(){
    let promise = new Promise(function(resolve, reject){
        superagent.get("http://www.dytt8.net/")
            .charset('gb2312') //解决编码问题
            .end(function (error, data) {
                if (error) {
                    reject(error)
                }
                let $ = cheerio.load(data.text);    //注意传递的是data.text而不是data本身
                let result = $('.co_content2 ul a');
                let length = result.length;
                for(let i=1;i<length;i++){
                    let text = result.eq(i).text();
                    let href = result.eq(i).attr('href');
                    let obj = {'名称':text,'链接':'http://www.dytt8.net'+href};
                    resultArray.push(obj);
                }
                resolve(resultArray);
            });
    });

    promise.then(function (value) {
        console.log(value);
    },function (error) {
        console.log(error)
    });
}
复制代码

2.3.2.2 使用Generator重构

温习一下Generator 与语法糖async的用法。重构之后你会知道什么是Thunk函数,什么是星函数... 这里直接贴代码了。

/**
 * 使用Genertor重构
 */
function getHomePageResourceByPromise(){
        let promise = new Promise(function(resolve, reject){
            superagent.get("http://www.dytt8.net/")
                .charset('gb2312') //解决编码问题
                .end(function (error, data) {
                    if (error) {
                        reject(error)
                    }
                    let $ = cheerio.load(data.text);    //注意传递的是data.text而不是data本身
                    let result = $('.co_content2 ul a');
                    let length = result.length;
                    for(let i=1;i<length;i++){
                        let text = result.eq(i).text();
                        let href = result.eq(i).attr('href');
                        let obj = {'名称':text,'链接':'http://www.dytt8.net'+href};
                        resultArray.push(obj);
                    }
                    resolve(resultArray);
                });
        });
        return promise;
    }

    async function getDataByGenertor(){
        let v1 = await getHomePageResourceByPromise();
        // let v2 = await getHomePageResourceByPromise();
        return v1;
    }

    getDataByGenertor().then(function (value) {
        console.log(value);
    },function (error) {
        console.log(error)
    });

复制代码

2.3.4 展望——未来的计划

通过自己写爬虫,加深了对JS的认识。接下来准备进军Node服务端的知识,然后继续基于JS搞RN 快应用 小程序等技术栈。当然学习新的技术并不能只知道怎么用,原理类的东西也是不可少的,所以还是要看一看Google的V8引擎相关的知识。

3.最后

最后想写一点这段时间的工作体会。记得之前很多人告诉我,在大厂就是干着拧螺丝的活,不如小公司接触的全面。这里我想说下我的观点,不管是大厂还是小厂,能match上自己的点才是最好的。一个人能成长到什么样的长度与在什么公司没有关系,与在什么岗位也没关系。只要足够自律并且朝着既定方向不断的努力,最终都会成长为自己想要的模样。我个人比较感谢阿里这个平台:

  • 技术功底 高德地图作为一款全民应用,由于用户量够多、机型种类覆盖全面,所以很多产品细节会被放大,这就要求从技术方案、技术细节上进行优化。这个过程会反向推动自己的技术积累。
  • 软实力 与一群优秀的人共事会潜移默化的改变自己的做事风格、看事情的角度。相信这些软实力会帮助我走的更远。

综上 个人感觉,这个平台值得大家来尝试一下。不为别的,只为让自己走的更快、更远。

低头走路,抬头看天,共勉~

注:下面是公司的部分职位,感兴趣的小伙伴可以看一下(想找我内推下的同学可以把简历发我邮箱 chenmu.wxj@alibaba-inc.com )。不感兴趣的就可以结束本文的阅读了哈

注:表格中的是高德的部分客户端职位(base北京),如果对其他职位或者BU感兴趣的同学也可以找我内推下

部门 职位
引擎研发部 高级C++开发工程师
应用开发部 移动端架构师TX
定位研发部 定位引擎高级C++工程师/专家(地图匹配)
定位研发部 定位算法高级工程师/专家(大数据网络定位)
定位研发部 vSLAM算法工程师/专家(视觉定位)
引擎研发部 资深引擎开发工程师/专家
定位研发部 高精定位算法专家
定位研发部 VSLAM资深(高级)算法专家

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Data Structures and Algorithms with JavaScript

Data Structures and Algorithms with JavaScript

Michael McMillan / O'Reilly Media / 2014-2-22 / USD 28.51

If you’re using JavaScript on the server-side, you need to implement classic data structures that conventional object-oriented programs (such as C# and Java) provide. This practical book shows you how......一起来看看 《Data Structures and Algorithms with JavaScript》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具