Javascript 我应该如何使用苗条和赛珀饼干?

Javascript 我应该如何使用苗条和赛珀饼干?,javascript,sapper,svelte-3,Javascript,Sapper,Svelte 3,我在用斯维特和赛珀做一个项目。假设我有一些代码需要在运行cookie之前读取cookie,并且该代码位于say/profile或其他位置 我的理解是Sapper不保证代码将在哪里运行。如果我将代码放在常规的标记或onMount块中,当用户直接从服务器请求/profile时,代码仍然在服务器上执行(并失败),但随后在客户机上再次执行: <script> import { getCookie } from "../../myUtilities.js"; const myCookieVa

我在用斯维特和赛珀做一个项目。假设我有一些代码需要在运行cookie之前读取cookie,并且该代码位于say
/profile
或其他位置

我的理解是Sapper不保证代码将在哪里运行。如果我将代码放在常规的
标记或
onMount
块中,当用户直接从服务器请求
/profile
时,代码仍然在服务器上执行(并失败),但随后在客户机上再次执行:

<script>
import { getCookie } from "../../myUtilities.js";

const myCookieValue = getCookie("myCookie");

async function myRuntimeAction() {
   let res = fetch(`https://www.example.com/api/${myCookieValue}`);
   ...
}
</script>

<form on:submit|preventDefault={myRuntimeAction}>
    <button>
      Take Action!
    </button>
</form>

从“../../myUtilities.js”导入{getCookie};
const mycokie value=getCookie(“mycokie”);
异步函数myRuntimeAction(){
让res=fetch(`https://www.example.com/api/${myCookieValue}`);
...
}
采取行动

有没有一种惯用的Svelte/Sapper方法可以保证代码在访问Cookie时只在客户端运行?

我找到了两种方法来解决这个问题:

1.访问仅在运行时客户端执行的函数内部的cookie 问题的根源在于我的变量声明是顶级声明。只需将访问cookie的代码移动到仅在运行时调用的函数中,即可解决此问题:

async function myRuntimeAction() {
   const myCookieValue = getCookie("myCookie");
   let res = fetch(`https://www.example.com/api/${myCookieValue}`);
   ...
}
2.在尝试访问Cookie之前,请检查process.browser Svelte公开
process.browser
,以确保代码仅在浏览器中执行:

if (process.browser) {
    const myCookieValue = getCookie("myCookie");
}

确保代码只在客户端运行的方法
从服务器发送的JS文件在客户端运行,cookies随请求发送到服务器-这就是您所需要的。在Svelte/Sapper中,代码也在服务器端运行(并且失败)。我要说的是,如果控制器向客户端发送文件,它们不再在服务器端进行解释。在Svelte+Sapper中,这是不准确的。Javascript代码将在客户端、服务器或(通常)两者上执行。您建议在向客户端发送js后,js将返回到服务器并再次执行—我不这么认为。服务器端渲染是一回事——客户端的JS功能是另一回事。