让前端飞

Dive in Taro (深入解读Taro)

2018-11-23  本文已影响2人  coolzilj

前言

闲赋在家,读读代码,顺便写写文章,本文首发简书,源码看到哪就更新到哪。

项目概览

lerna

taro 用 lerna 做多模块管理,lerna 多见于中大型项目,比如 babel。

taro 想要在开发环境下跑起来,只需要:

cd taro目录
npm i
npm run bootstrap => npm-run-all clear-all bootstrap:lerna

npm run bootstrap 做了两个事情:

  1. clear-all
    清理所有的旧依赖
    rimraf package-lock.json packages/*/node_modules packages/*/package-lock.json
  2. bootstrap:lerna
    初始化 lerna
    lerna bootstrap -- --ignore-engines (--ignore-engines 这个参数是给 npm client 的)

其中第二步 bootstrap:lerna 具体做了:

参考
- lerna bootstrap

taro-cli

脚手架工具,用于初始化 taro 项目,编译成多端平台代码

bin/taro
先从入口文件 bin/taro 说起,项目用了 tj/commander,这可以说是 tj 大神在 js 叱咤风云时的一大杰作,灵感来源于 ruby 的 commander。
taro 使用了像 git 一样的子命令,taro init xxx,在 commander 你只需要在 bin/ 目录下,创建对应的 program-command 文件即可,比如 taro-inittaro-build 等。

bin/taro-init
taro-init 文件就是传递命令行的参数进去,无需介绍太多,重点在于我是怎么一步一步看代码的。
node 现在 debug 已经很方便,方法如下:

node --inspect-brk ~/wip/to-be-read/taro/packages/taro-cli/bin/taro-init myApp # 找到入口文件,像教程一样开始新手教学
chrome://inspect # 打开 chrome,输入,找到 remote target 点击进去即可

简单理一下 init 的过程:

  1. Project.new
    1. .ask (return inquirer.prompt(prompts)) 询问用户各种配置
    2. .ask 返回的配置赋值给 project.conf
  2. Project.write
    1. const templateCreate = require(path.join(this.templatePath(), template, 'index.js')) 动态加载对应的 template 的 index.js 文件
    2. 然后传参 (project.conf) 进去初始化,生成对应的模板文件

bin/taro-build
不同的端对应的逻辑在:

  1. h5.js
  2. weapp.js - swan
  3. weapp.js - alipay
  4. weapp.js - weapp
  5. rn.js
  6. ui.js (专门给 taro-ui 用的)

weapp build 大致过程

  1. buildProjectConfig()
    复制 taro 根目录下的 project.config.jsondist/,并把 miniprogramRoot 改成 ./, 这样就可以把 dist/ 拖到微信开发者工具,而不是整个taro 项目,解决了频繁编译问题

参考:
- https://github.com/nervjs/taro/issues/190

  1. copyFiles()
    小程序编译增加 copy 功能,用于把taro项目的资源拷贝到对应的端

参考:
- https://github.com/coolzilj/taro/commit/0132a0ecda029b3bac2b3cf605e6e67193fec37d
- 配置详情 · Taro

  1. buildEntry()
    编译入口文件(src/app.js
    具体步骤如下:
  1. buildPages()

Babel

一般来说,将一种结构化语言的代码编译成另一种类似的结构化语言的代码包括以下几个步骤:


image.png

参考:
- https://github.com/jamiebuilds/babel-handbook/blob/master/translations/en/plugin-handbook.md
- http://www.alloyteam.com/2017/04/analysis-of-babel-babel-overview/
- https://www.h5jun.com/post/babel-for-es6-and-beyond.html
- https://astexplorer.net/

上一篇下一篇

猜你喜欢

热点阅读