Skip to content

Commit 6e7a0ca

Browse files
committed
feat: 设置半编译预处理config
1 parent f00b14a commit 6e7a0ca

File tree

14 files changed

+163
-77
lines changed

14 files changed

+163
-77
lines changed

crates/swc_plugin_compile_mode_pre_process/src/lib.rs

+2-8
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,11 @@ mod tests;
1212
mod utils;
1313
mod visitors;
1414
use visitors::entry::EntryVisitor;
15-
struct SerdeDefault;
16-
impl SerdeDefault {
17-
fn platform_default() -> String {
18-
String::from("WEAPP")
19-
}
20-
}
2115

2216
#[derive(Deserialize, Debug)]
2317
pub struct PluginConfig {
24-
#[serde(default = "SerdeDefault::platform_default")]
25-
pub platform: String,
18+
#[serde(default)]
19+
sub_render_fn: String,
2620
}
2721

2822
#[plugin_transform]

crates/swc_plugin_compile_mode_pre_process/src/tests/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ pub fn tr() -> impl Fold {
1212
let config = serde_json::from_str::<PluginConfig>(
1313
r#"
1414
{
15+
"sub_render_fn": "subRenderFn"
1516
}"#,
1617
)
1718
.unwrap();
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
pub const COMPILE_MODE: &str = "compileMode";
2-
pub const COMPILE_MODE_SUB_RENDER_FN_VAL: &str = "subRenderFn";
32
pub const DEFAULT_COMPONENT: &str = "Default_Component";

crates/swc_plugin_compile_mode_pre_process/src/visitors/collect_render_fn.rs

+11-10
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,32 @@ use swc_core::ecma::{
44
visit::{VisitMut, VisitMutWith},
55
};
66

7-
use crate::utils::{
8-
constant::{COMPILE_MODE, COMPILE_MODE_SUB_RENDER_FN_VAL},
9-
render_fn::RenderFn,
7+
use crate::{
8+
utils::{constant::COMPILE_MODE, render_fn::RenderFn},
9+
PluginConfig,
1010
};
1111

12-
pub struct CollectRenderFnVisitor {
12+
pub struct CollectRenderFnVisitor<'a> {
1313
pub raw_render_fn_map: HashMap<String, RenderFn>,
1414
sub_component_name: Option<String>,
1515
sub_component_params: Option<Vec<Pat>>,
1616
in_outmost_block_scope: bool,
17+
config: &'a PluginConfig,
1718
}
1819

19-
impl CollectRenderFnVisitor {
20-
pub fn new() -> Self {
20+
impl<'a> CollectRenderFnVisitor<'a> {
21+
pub fn new(config: &'a PluginConfig) -> Self {
2122
CollectRenderFnVisitor {
2223
raw_render_fn_map: HashMap::new(),
2324
sub_component_name: None,
2425
sub_component_params: None,
2526
in_outmost_block_scope: true,
27+
config,
2628
}
2729
}
2830
}
2931
//只在最外层找就可以了,因为这个函数是一个 react 组件的入口
30-
impl VisitMut for CollectRenderFnVisitor {
32+
impl<'a> VisitMut for CollectRenderFnVisitor<'a> {
3133
fn visit_mut_block_stmt(&mut self, n: &mut BlockStmt) {
3234
if !self.in_outmost_block_scope {
3335
return;
@@ -120,8 +122,7 @@ impl VisitMut for CollectRenderFnVisitor {
120122
Some(sub_component_name),
121123
Some(sub_component_params),
122124
) => {
123-
if jsx_attr_name.sym == COMPILE_MODE && value == COMPILE_MODE_SUB_RENDER_FN_VAL
124-
{
125+
if jsx_attr_name.sym == COMPILE_MODE && *value == self.config.sub_render_fn {
125126
self.raw_render_fn_map.insert(
126127
sub_component_name.clone(),
127128
RenderFn::new(sub_component_params.clone(), *jsx_element.clone()),
@@ -149,7 +150,7 @@ impl VisitMut for CollectRenderFnVisitor {
149150
Some(sub_component_name),
150151
Some(sub_component_params),
151152
) => {
152-
if jsx_attr_name.sym == COMPILE_MODE && value == COMPILE_MODE_SUB_RENDER_FN_VAL {
153+
if jsx_attr_name.sym == COMPILE_MODE && *value == self.config.sub_render_fn {
153154
self.raw_render_fn_map.insert(
154155
sub_component_name.clone(),
155156
RenderFn::new(sub_component_params.clone(), *jsx_element.clone()),

crates/swc_plugin_compile_mode_pre_process/src/visitors/entry.rs

+7-3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use super::generate_deps::GenerateDepsVisitor;
1515
use super::transform::component_entry::ComponentEntryVisitor;
1616
pub struct EntryVisitor {
1717
visitor_context: VisitorContext,
18+
config: PluginConfig,
1819
}
1920

2021
struct VisitorContext {
@@ -31,6 +32,7 @@ impl EntryVisitor {
3132
react_component_formatted_render_fn_map: HashMap::new(),
3233
react_component_list: vec![],
3334
},
35+
config,
3436
}
3537
}
3638
}
@@ -75,7 +77,7 @@ impl EntryVisitor {
7577
.clone()
7678
.into_iter()
7779
.for_each(|mut react_component| {
78-
let mut collect_render_fn_visitor = CollectRenderFnVisitor::new();
80+
let mut collect_render_fn_visitor = CollectRenderFnVisitor::new(&self.config);
7981
react_component
8082
.block_stmt
8183
.visit_mut_with(&mut collect_render_fn_visitor);
@@ -121,8 +123,10 @@ impl EntryVisitor {
121123
}
122124

123125
fn transform(&mut self, n: &mut Module) {
124-
let mut transform_visitor =
125-
ComponentEntryVisitor::new(&self.visitor_context.react_component_formatted_render_fn_map);
126+
let mut transform_visitor = ComponentEntryVisitor::new(
127+
&self.visitor_context.react_component_formatted_render_fn_map,
128+
&self.config,
129+
);
126130
n.visit_mut_children_with(&mut transform_visitor);
127131
}
128132
}

crates/swc_plugin_compile_mode_pre_process/src/visitors/transform/component_entry.rs

+16-7
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,26 @@ use swc_core::ecma::{
55
visit::{VisitMut, VisitMutWith},
66
};
77

8-
use crate::utils::{constant::DEFAULT_COMPONENT, render_fn::RenderFn};
8+
use crate::{
9+
utils::{constant::DEFAULT_COMPONENT, render_fn::RenderFn},
10+
PluginConfig,
11+
};
912

1013
use super::process::TransformProcessVisitor;
1114

1215
pub struct ComponentEntryVisitor<'a> {
1316
format_render_fn_map: &'a HashMap<String, HashMap<String, RenderFn>>,
17+
config: &'a PluginConfig,
1418
}
1519

1620
impl<'a> ComponentEntryVisitor<'a> {
17-
pub fn new(format_render_fn_map: &'a HashMap<String, HashMap<String, RenderFn>>) -> Self {
21+
pub fn new(
22+
format_render_fn_map: &'a HashMap<String, HashMap<String, RenderFn>>,
23+
config: &'a PluginConfig,
24+
) -> Self {
1825
ComponentEntryVisitor {
1926
format_render_fn_map,
27+
config: config,
2028
}
2129
}
2230

@@ -42,7 +50,7 @@ impl<'a> VisitMut for ComponentEntryVisitor<'a> {
4250
let component_name = ident.sym.to_string();
4351
let render_fn_map = self.get_format_render_fn_map_by_component_name(&component_name);
4452
if let Some(render_fn_map) = render_fn_map {
45-
let mut process_visitor = TransformProcessVisitor::new(&render_fn_map);
53+
let mut process_visitor = TransformProcessVisitor::new(&render_fn_map, &self.config);
4654
decl.init.visit_mut_children_with(&mut process_visitor);
4755
}
4856
}
@@ -55,7 +63,8 @@ impl<'a> VisitMut for ComponentEntryVisitor<'a> {
5563
let component_name = ident.sym.to_string();
5664
let render_fn_map = self.get_format_render_fn_map_by_component_name(&component_name);
5765
if let Some(render_fn_map) = render_fn_map {
58-
let mut process_visitor = TransformProcessVisitor::new(&render_fn_map);
66+
let mut process_visitor =
67+
TransformProcessVisitor::new(&render_fn_map, &self.config);
5968
decl.init.visit_mut_children_with(&mut process_visitor);
6069
}
6170
}
@@ -72,7 +81,7 @@ impl<'a> VisitMut for ComponentEntryVisitor<'a> {
7281
let component_name = n.ident.sym.to_string();
7382
let render_fn_map = self.get_format_render_fn_map_by_component_name(&component_name);
7483
if let Some(render_fn_map) = render_fn_map {
75-
let mut process_visitor = TransformProcessVisitor::new(&render_fn_map);
84+
let mut process_visitor = TransformProcessVisitor::new(&render_fn_map, &self.config);
7685
n.function
7786
.body
7887
.visit_mut_children_with(&mut process_visitor);
@@ -87,7 +96,7 @@ impl<'a> VisitMut for ComponentEntryVisitor<'a> {
8796
let render_fn_map =
8897
self.get_format_render_fn_map_by_component_name(&DEFAULT_COMPONENT.to_string());
8998
if let Some(render_fn_map) = render_fn_map {
90-
let mut process_visitor = TransformProcessVisitor::new(&render_fn_map);
99+
let mut process_visitor = TransformProcessVisitor::new(&render_fn_map, &self.config);
91100
fn_decl
92101
.function
93102
.body
@@ -107,7 +116,7 @@ impl<'a> VisitMut for ComponentEntryVisitor<'a> {
107116
let render_fn_map =
108117
self.get_format_render_fn_map_by_component_name(&DEFAULT_COMPONENT.to_string());
109118
if let Some(render_fn_map) = render_fn_map {
110-
let mut process_visitor = TransformProcessVisitor::new(&render_fn_map);
119+
let mut process_visitor = TransformProcessVisitor::new(&render_fn_map, &self.config);
111120
n.expr.visit_mut_children_with(&mut process_visitor);
112121
}
113122
}

crates/swc_plugin_compile_mode_pre_process/src/visitors/transform/process.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,23 @@ use swc_core::ecma::{
66
visit::{VisitMut, VisitMutWith},
77
};
88

9-
use crate::utils::{
10-
constant::{COMPILE_MODE, COMPILE_MODE_SUB_RENDER_FN_VAL},
11-
render_fn::RenderFn,
9+
use crate::{
10+
utils::{constant::COMPILE_MODE, render_fn::RenderFn},
11+
PluginConfig,
1212
};
1313

1414
pub struct TransformProcessVisitor<'a> {
1515
render_fn_map: &'a HashMap<String, RenderFn>,
1616
in_compile_mode_jsx: bool,
17+
config: &'a PluginConfig,
1718
}
1819

1920
impl<'a> TransformProcessVisitor<'a> {
20-
pub fn new(render_fn_map: &'a HashMap<String, RenderFn>) -> Self {
21+
pub fn new(render_fn_map: &'a HashMap<String, RenderFn>, config: &'a PluginConfig) -> Self {
2122
TransformProcessVisitor {
2223
render_fn_map,
2324
in_compile_mode_jsx: false,
25+
config,
2426
}
2527
}
2628
}
@@ -48,7 +50,7 @@ impl<'a> VisitMut for TransformProcessVisitor<'a> {
4850
(
4951
JSXAttrName::Ident(jsx_attr_name),
5052
Some(JSXAttrValue::Lit(Lit::Str(Str { value, .. }))),
51-
) => !(jsx_attr_name.sym == COMPILE_MODE && value == COMPILE_MODE_SUB_RENDER_FN_VAL),
53+
) => !(jsx_attr_name.sym == COMPILE_MODE && *value == self.config.sub_render_fn),
5254
_ => true,
5355
},
5456
_ => true,

packages/shared/src/constants.ts

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ export enum PLATFORM_TYPE {
88

99
export const COMPILE_MODE_IDENTIFIER_PREFIX = 'f'
1010

11+
export const COMPILE_MODE_SUB_RENDER_FN = 'subRenderFn'
12+
1113
export const PLATFORM_CONFIG_MAP = {
1214
h5: {
1315
type: PLATFORM_TYPE.WEB

packages/taro-components/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
"@stencil/core": "2.22.3",
6060
"hammerjs": "^2.0.8",
6161
"@tarojs/runtime": "workspace:*",
62+
"@tarojs/shared": "workspace:*",
6263
"@tarojs/components-advanced": "workspace:*",
6364
"@tarojs/taro": "workspace:*",
6465
"classnames": "^2.2.5",

packages/taro-components/types/common.d.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { CSSProperties, LegacyRef, ReactNode } from 'react'
2+
import { COMPILE_MODE_SUB_RENDER_FN } from '@tarojs/shared'
23

3-
type COMPILE_MODE_SUB_RENDER_FN = 'subRenderFn'
44
export interface StandardProps<T = any, TouchEvent extends BaseTouchEvent<any> = ITouchEvent> extends EventProps<TouchEvent> {
55
/** 组件的唯一标示, 保持整个页面唯一 */
66
id?: string
@@ -28,10 +28,10 @@ export interface StandardProps<T = any, TouchEvent extends BaseTouchEvent<any> =
2828
__html: string
2929
}
3030
/**
31-
* 是否开启编译模式
31+
* 是否开启编译模式 或者 是否是编译模式的子渲染函数
3232
* @supported weapp, harmony
3333
*/
34-
compileMode?: boolean | string | COMPILE_MODE_SUB_RENDER_FN
34+
compileMode?: boolean | string | typeof COMPILE_MODE_SUB_RENDER_FN
3535
/**
3636
* 自定义容器组件的方向
3737
* @supported harmony
Binary file not shown.
Binary file not shown.

packages/taro-webpack5-runner/src/loaders/miniCompilerLoader.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { swc } from '@tarojs/helper'
2-
import { COMPILE_MODE_IDENTIFIER_PREFIX, getComponentsAlias } from '@tarojs/shared'
2+
import { COMPILE_MODE_IDENTIFIER_PREFIX, COMPILE_MODE_SUB_RENDER_FN, getComponentsAlias } from '@tarojs/shared'
33
import { isUrlRequest, urlToRequest } from 'loader-utils'
44

55
import { templatesCache, XMLDependency } from '../plugins/MiniCompileModePlugin'
@@ -56,7 +56,9 @@ export default async function (this: LoaderContext<IOptions>, source) {
5656
plugins: [
5757
[
5858
'@tarojs/helper/swc/swc_plugin_compile_mode_pre_process.wasm',
59-
{}
59+
{
60+
sub_render_fn: COMPILE_MODE_SUB_RENDER_FN,
61+
}
6062
],
6163
[
6264
'@tarojs/helper/swc/swc_plugin_compile_mode.wasm',

0 commit comments

Comments
 (0)