让我们从定义开始:A transducer
是一个函数,它接受一个reducer
函数并返回一个reducer
函数.
A reducer
是一个二元函数,它接受累加器和值并返回累加器.一个reducer可以用一个reduce
函数执行(注意:所有函数都是curry但是我已经把它和它的定义pipe
以及compose
为了便于阅读 - 你可以在现场演示中看到它们):
const reduce = (reducer, init, data) => {
let result = init;
for (const item of data) {
result = reducer(result, item);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
随着reduce
我们可以实现map
和filter
功能:
const mapReducer = xf => (acc, item) => [...acc, xf(item)];
const map = (xf, arr) => reduce(mapReducer(xf), [], arr);
const filterReducer = predicate => (acc, item) => …
Run Code Online (Sandbox Code Playgroud) 如果我不指定public
或private
在指令中Cache-Control
标头中默认行为是什么?它是否可以被代理服务器缓存?
考虑这个基本示例,其中我们有一个input
和 ap
显示输入的值:
const App = {
data() {
return {
message: "hello world!"
};
}
};
Vue.createApp(App).mount('#root');
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/vue@next"></script>
<div id="root">
<input v-model="message"/>
{{ message }}
</div>
Run Code Online (Sandbox Code Playgroud)
当您更改输入文本时,它会反映在p
. 但是,如果您替换data()
为setup()
,则对 的更改input
不再反映在p
:
const App = {
setup() {
return {
message: "hello world!"
};
}
};
Vue.createApp(App).mount('#root');
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/vue@next"></script>
<div id="root">
<input v-model="message"/>
{{ message }}
</div>
Run Code Online (Sandbox Code Playgroud)
一个简单的解决方法是ref
在message
:
const App = {
setup() { …
Run Code Online (Sandbox Code Playgroud)考虑这个说明性示例:
const useFeatureX = () => {
return Vue.reactive({
x1: 2,
x2: 3
});
};
const useFeatureY = () => {
return Vue.reactive({
y1: 1,
y2: 2
});
};
const App = {
setup() {
return { ...useFeatureX(), ...useFeatureY() };
}
};
Vue.createApp(App).mount("#root");
Run Code Online (Sandbox Code Playgroud)
input {
max-width: 50px;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/vue@next"></script>
<div id="root">
x1 + x2: <input type="number" v-model="x1"/> + <input type="number" v-model="x2"/> = {{ +x1 + +x2 }} <br/>
y1 + y2: <input type="number" v-model="y1"/> + <input type="number" v-model="y2"/> = …
Run Code Online (Sandbox Code Playgroud)自定义事件没有在 Vue 2 中传播。Vue 3 中是否有变化,因为如以下示例所示,自定义事件看起来像在组件链中冒泡:
const Comp1 = {
template: `
<button @click="this.$emit('my-event')">click me</button>
`
}
const Comp2 = {
components: {
Comp1
},
template: `
<Comp1/>
`
}
const HelloVueApp = {
components: {
Comp2
},
methods: {
log() {
console.log("event handled");
}
}
}
Vue.createApp(HelloVueApp).mount('#hello-vue')
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/vue@next"></script>
<div id="hello-vue" class="demo">
<Comp2 @my-event="log"/>
</div>
Run Code Online (Sandbox Code Playgroud)
在https://v8.dev/docs/ignition上,我们可以看到:
Ignition是使用TurboFan后端编写的基于寄存器的快速底层解释器
在https://docs.google.com/document/d/11T2CRex9hXxoJwbYqVQ32yIPMh0uouUZLdyrtmMoL44/edit?ts=56f27d9d#
Ignition项目的目的是为V8构建一个解释器,该解释器执行一个低级字节码,从而使运行一次或非热码以字节码形式更紧凑地存储。
解释器本身由一组字节码处理程序代码片段组成,每个片段均处理特定的字节码,并分派给下一个字节码的处理程序。这些字节码处理程序
为了将函数编译为字节码,将对JavaScript代码进行解析以生成其AST(抽象语法树)。BytecodeGenerator遍历此AST,并根据需要为每个AST节点生成字节码。
生成字节码处理程序的图形后,该图形将通过Turbofan管道的简化版本传递,并分配给解释器表中的相应条目。
因此,似乎点火工作是将BytecodeGenerator生成的字节码转换为字节码处理程序,然后通过执行Turbofan
。
您可以看到是点火产生了字节码。
此外,在此视频中https://youtu.be/p-iiEDtpy6I?t=722点火被称为基准编译器。
那是什么 基准编译器?字节码解释器?AST转换为字节码转换器?
在这里,点火只是一个解释器,之前的一切都是无名的字节码生成器/优化器。
输入时会npm run <command>
怎样?是<command>传递给sh shell的方法,例如:
sh -c <command>
Run Code Online (Sandbox Code Playgroud)
在外壳程序中添加了其他局部变量,即node_modules/.bin
?的路径。
我认为npm仅可通过使用node在JavaScript Universe中工作,但似乎还有很多事情要做。如何&
与&&
被处理的?是globstar安全使用?
如您所知,在严格模式下只能undefined
分配给 type void
。所以如果你尝试:
declare let _void: void;
_void = null; // error
_void = 5; // error
Run Code Online (Sandbox Code Playgroud)
你会得到错误
[type]不可分配给 void 类型。
但如果您尝试将此作为返回类型,则一切正常:
declare let voidReturn: () => void;
declare let nullReturn: () => null;
declare let numReturn: () => number;
voidReturn = numReturn;
voidReturn = nullReturn;
Run Code Online (Sandbox Code Playgroud)
void
此处的行为就像any
它可以容纳任何类型(但它只能以一种方式工作 - 分配void
给任何其他返回类型会引发错误)。
这是为什么?这是一个错误还是一个功能?
一些描述 http/2 的文章称赞它是双向和全双工的。
AFAIK 双向意味着通信是双向的,所以双工本质上是双向的,是吗?
双工可以由一个在某些特定点反转的单工流创建(半双工),也可以创建为两个相反的单工流(全双工)。
也许双向是关于如何发起消息交换?在 http/1 中,只有客户端可以通过向服务器发送请求来启动,服务器在其中返回响应。在 http/2 中,服务器可以发送(推送)一些资源而无需明确要求它。但是我们可以Server-sent events
在http/1.1中使用(也就是说,在客户端和服务器上都做了一些配置后,如果它愿意,服务器可以推送消息,但它仍然是通过http/1.1协议)。
当您考虑它时,您可能会注意到 http/1 也是双向和全双工的(因为在半双工中流水线是不可能的)。所以从 http/2 的角度来看这里没有变化。
发生变化的是 http/1 要求响应按照请求的确切顺序到达。http/2 通过流和多路复用提升了这一点。
考虑这个说明性示例:
const App = {
setup() {
const name = Vue.ref("");
let firstTime = true;
const message = Vue.computed(() => {
if (firstTime) {
firstTime = false;
return "Welcome stranger";
}
return `Hello ${name.value}`;
});
return {
name,
message
}
}
};
Vue.createApp(App).mount("#root");
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/vue@next"></script>
<div id="root">
name: <input v-model="name"/> <br/>
message: {{ message }}
</div>
Run Code Online (Sandbox Code Playgroud)
如您所见,message
存储一个计算值,该值应该跟踪更新,name
但它不是。
为什么会这样以及如何解决?
我正在尝试 从using模式中获取html
位于 url 的文件,但响应被 CORB(跨源读取阻塞)阻止。https://sub.app.test/html
https://app.test
no-cors
fetch('https://sub.app.test/html', { mode: 'no-cors'})
Run Code Online (Sandbox Code Playgroud)
为什么?
javascript ×6
vue.js ×4
vuejs3 ×4
caching ×1
cors ×1
duplex ×1
fetch ×1
http2 ×1
node.js ×1
npm ×1
sh ×1
shell ×1
transducer ×1
typescript ×1
v8 ×1