[15章]深入学习小程序框架底层原理,培养双线程思维

赵颜
• 阅读 137

学习地址1:https://pan.baidu.com/s/1ridzu0mrj1vrfT07fdReuw 提取码:3zd2 学习地址2:https://pan.baidu.com/s/1SChn_JCGf03sybLfyAnkCA 提取码:c862

前端高手特训 从0到1带你手写一个微信小程序底层框架,今天就带着大家从0到深入学习小程序框架底层原理,无论你是一位新手,还是一位有经验的开发者,能够自研一套小程序底层框架,都是你突破技术瓶颈有效途径。

今天就由我带领大家从架构设计 ,原理剖析,再到源码的实现,一步步地实战构建一个完整的微信小程序底层框架,让你深度掌握小程序双线程原理,助力你具备把握最佳机会的能力和提升获取心仪Offer的成功率,成为一个真正有实力的技术人才 。

小程序使用的是Exparser组件模型,Exparser组件模型与Web Components中的shadow DOM高度相似,微信为什么使用自定义组件框架,而不使用Web Components呢?主要还是出于安全考虑,并且方便管控。既然Exparser组件框架与shadow DOM高度相似,那么我们首先来了解一下shadow DOM。

本题比较特殊,我们要删除目前所在的节点,而没有它的前趋节点。题目已经告诉我们删除的不是尾节点,我们可以拷贝它的后继节点内容到它本身的位置。这样链表里有两个内容相同的节点——即它的后继节点出现了两次,我们把它的后继节点删除即可。 /**

  • Definition for singly-linked list.
  • public class ListNode {
  • int val;
  • ListNode next;
  • ListNode(int x) { val = x; }
  • }
  • / class Solution { public void deleteNode(ListNode node) {
      node.val = node.next.val;
      node.next = node.next.next;
    } } } 思路分析:滑动窗口——和我们之前讲的链表找环问题类似。快指针每次走两步,慢指针每次走一步,如此快指针移动到链表末尾的时候,慢指针刚好移动到中间。注意细节,链表长度的奇偶性,以及如何判断末尾等。

代码 /**

  • Definition for singly-linked list.

  • public class ListNode {

  • int val;

  • ListNode next;

  • ListNode() {}

  • ListNode(int val) { this.val = val; }

  • ListNode(int val, ListNode next) { this.val = val; this.next = next; }

  • }

  • / class Solution { public ListNode middleNode(ListNode head) {

      for (ListNode temp = head; temp != null && temp.next != null; temp = temp.next.next, head = head.next)
      ;
      return head;

    } } 思路分析: 可以在push时进行反向操作。 class MyStack { private Queue[] q;

    private int getInd() {

      return q[0].isEmpty() ? 1 : 0;

    }

    /** Initialize your data structure here. */ public MyStack() {

      q = new Queue[2];
      for (int i = 0; i < 2; ++i) {
          q[i] = new LinkedList<>();
      }

    }

    /** Push element x onto stack. */ public void push(int x) {

      q[getInd()].add(x);

    }

    /** Removes the element on top of the stack and returns that element. */ public int pop() {

      final int ind = getInd();
      for (; q[ind].size() > 1; q[ind ^ 1].add(q[ind].poll()))
      ;
      return q[ind].poll();

    }

    /** Get the top element. */ public int top() {

      int r = pop();
      push(r);
      return r;

    }

    /** Returns whether the stack is empty. */ public boolean empty() {

      return q[0].isEmpty() && q[1].isEmpty();

    } }

/**

  • Your MyStack object will be instantiated and called as such:
  • MyStack obj = new MyStack();
  • obj.push(x);
  • int param_2 = obj.pop();
  • int param_3 = obj.top();
  • boolean param_4 = obj.empty();
  • /

思路分析:把0和n加到端点里,得到数组c,排序后任意一段木棍可以用c中两个元素表示。定义dp[i][j]表示从端点c[i]到c[j]的木棍都切好后的最小代价。 dp[i][j] = 0 对于j <= i + 1 dp[i][j] = min(dp[i][k] + dp[k][j]) + c[j] - c[i] i < k < j 枚举切点k,分别切两段。 class Solution { public int minCost(int n, int[] cuts) { int[] c = new int[cuts.length + 2]; c[1] = n; System.arraycopy(cuts, 0, c, 2, cuts.length); Arrays.sort(c); final int m = c.length; int[][] dp = new int[m][m]; for (int d = 2; d < m; ++d) { for (int i = 0; i + d < m; ++i) { final int j = i + d; dp[i][j] = Integer.MAX_VALUE; for (int k = i + 1; k < j; ++k) { dp[i][j] = Math.min(dp[i][j], dp[i][k] + dp[k][j]); } dp[i][j] += c[j] - c[i]; } } return dp[0][m - 1]; } } 思路分析:设dp[i][j]表示从s的长度为i的前缀中删掉不超过k个字符最终得到的最短压缩串长度。 dp[0][j] = 0, 空串。 dp[i][j] = min(dp[i - 1][j - 1], dp[p][j - x] + (y个s.charAt(i - 1)的压缩长度)) 其中p < i, 设c = s.charAt(i - 1), x是s.charAt(p…i)中非c出现的次数,要删掉它们, 而y是其中c出现的次数,要全部保留。实际上我们枚举了目前压缩串最后一部分中删掉c和保留y个c的全部可能性。 class Solution { private int getLen(int x) { if (x == 1) { return 1; } if (x < 10) { return 2; } if (x < 100) { return 3; } return 4; } public int getLengthOfOptimalCompression(String s, int k) { final int n = s.length(); int[][] dp = new int[n + 1][k + 1]; for (int i = 1; i <= n; ++i) { final char c = s.charAt(i - 1); for (int j = 0; j <= k; ++j) { dp[i][j] = j > 0 ? dp[i - 1][j - 1] : Integer.MAX_VALUE; for (int p = i - 1, num = 0, t = j; p >= 0; --p) { if (s.charAt(p) == c) { ++num; } else if (--t < 0) { break; } dp[i][j] = Math.min(dp[i][j], getLen(num) + dp[p][t]); } } } return dp[n][k]; } } 思路分析: 方法1 经典算法 dp[i]表示以nums[i]结尾的最长单调子序列长度。 dp[i] = max(dp[j]) + 1 (0 <= j < i, nums[j] < nums[i]) 解是max(dp[i]) (0 <= i < nums.length)

代码: class Solution { public int lengthOfLIS(int[] nums) { final int n = nums.length; int[] dp = new int[n]; int r = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < i; ++j) { if (nums[j] < nums[i]) { dp[i] = Math.max(dp[i], dp[j]); } } r = Math.max(r, ++dp[i]); } return r; } } 结语 介绍到这里,小程序的底层框架原理基本已经介绍完了,想跟大家分享的是,小程序确实和h5非常类似,其实它相当于一个借助了native强大功能的加强版h5,小程序并不神秘,除了微信小程序之外,现在各大超级APP都已经推出了自己的小程序,原理应该都大差不差。

点赞
收藏
评论区
推荐文章
荀勗 荀勗
4个月前
[15章]深入学习小程序框架底层原理,培养双线程思维
资料地址1:https://pan.baidu.com/s/1enXgRjk9LndH6X1t2vyOzQ提取码:id17资料地址2:https://pan.baidu.com/s/1SChnJCGf03sybLfyAnkCA提取码:c862前端高手特训从
吉太 吉太
4个月前
深入学习小程序框架底层原理,培养双线程思维(2023版,15章)
教程地址1:https://pan.baidu.com/s/1lj7N67dpdCdW6IIafZWDuQ提取码:7964教程地址2:https://pan.baidu.com/s/1SChnJCGf03sybLfyAnkCA提取码:c862小程序上线以来
赵嬷嬷 赵嬷嬷
3个月前
[16章]慕课甄选-2024年Flutter零基础极速入门到进阶实战
学习地址1:https://pan.baidu.com/s/1iOH2xMvdMyBAJla5PeHuUg提取码:hjhi学习地址2:https://pan.baidu.com/s/1Iwj10AL7jdum19WQz1jdA提取码:0n8xFlutter
赵嬷嬷 赵嬷嬷
3个月前
[31周]AI人工智能算法工程师体系课2024
学习地址1:https://pan.baidu.com/s/1wpfuPvDb4Y4BQEKPt7bc1A提取码:q7xz学习地址2:https://pan.baidu.com/s/1CYzDHRmYKDPb29MfKN0qlg提取码:2jt4今天给大家讲
鲍二家的 鲍二家的
2个月前
[完结16章]深入学习小程序框架底层原理,培养双线程思维
学习地址1:https://pan.baidu.com/s/1vPkKOYl1stfhAlu8UCdA提取码:xty2学习地址2:https://share.weiyun.com/a7zmLRVg密码:t4jrfm深入学习小程序框架底层原理,培养双线程思维
鲍二家的 鲍二家的
1个月前
AI Agent智能应用从0到1定制开发(12章)
学习地址1:https://pan.baidu.com/s/1ccnoXsPCUg4eP5rSrD0UA提取码:o0mu学习地址2:https://pan.baidu.com/s/1JYJ6dMkwgx0XWQnCM6Q0A提取码:2m68AIAgent已
双寿 双寿
1个月前
[12章]AI Agent智能应用从0到1定制开发
学习地址1:https://pan.baidu.com/s/15IbktHy54IdZRg3g7PWWKQ提取码:v7lt学习地址2:https://pan.baidu.com/s/1JYJ6dMkwgx0XWQnCM6Q0A提取码:2m68AIAgent
鲍二家的 鲍二家的
1个月前
[7章]Go从入门到进阶,大厂案例全流程实践
学习地址1:https://pan.baidu.com/s/1kZq7Rc7PHBRYEzWL85FCA提取码:0udi学习地址2:https://pan.baidu.com/s/1Rr5G2U3YSbwhFTLMHH2keA提取码:j0viGo语言高效、
鲍二家的 鲍二家的
1个月前
前端跳槽突围课:React18底层源码深入剖析
学习地址1:https://pan.baidu.com/s/1DnzdWB9oCEMGOx9jvYjAjg提取码:hqw0学习地址2:https://pan.baidu.com/s/1kUlrpqlboZIrRmXpiT9TLw提取码:ur5i在当下就业环
鲍二家的 鲍二家的
1个月前
[完结17章]SpringBoot3+Vue3 开发高并发秒杀抢购系统
学习地址1:https://pan.baidu.com/s/1DRZXkQeGkrPwhVTd2ko00g提取码:gpwn学习地址2:https://share.weiyun.com/ysK13sR2密码:74m96t众所周知,作为开发新手,入行、实习、转