Next.js-文件中的导入服务器端包是否同时包含服务器端和客户端功能?

Next.js-文件中的导入服务器端包是否同时包含服务器端和客户端功能?,next.js,Next.js,假设我有一个名为utils.js的文件,其中包含两个函数s和c。 s是一个服务器端函数(在/api端点处理程序上调用),使用mongodb包。 c是客户端功能(将被捆绑并发送到浏览器) 使用下一版本编译应用程序时,是否会导致任何问题? webpack是否知道仅捆绑文件/模块的一部分?(将服务器端函数和导入视为“死代码”,因为它们仅从服务器端代码调用) 谢谢我认为会有错误,但不会出现在构建时。很可能会在运行时发生问题。您将无法访问客户端的文件系统,就像无法访问服务器端的窗口对象一样 在我当前的项目

假设我有一个名为utils.js的文件,其中包含两个函数s和c。 s是一个服务器端函数(在/api端点处理程序上调用),使用mongodb包。 c是客户端功能(将被捆绑并发送到浏览器)

使用下一版本编译应用程序时,是否会导致任何问题? webpack是否知道仅捆绑文件/模块的一部分?(将服务器端函数和导入视为“死代码”,因为它们仅从服务器端代码调用)


谢谢

我认为会有错误,但不会出现在构建时。很可能会在运行时发生问题。您将无法访问客户端的文件系统,就像无法访问服务器端的
窗口
对象一样

在我当前的项目中,我们有服务器端、客户端或通用的实用功能。在
getServerSideProps
中调用所有服务器端函数,以确保它们按预期工作。如果您所说的“死代码”,则
getServerSideProps
中的所有服务器端代码都不会作为客户端捆绑包的一部分导入。根据Next.js

注意:您可以导入顶级作用域中的模块以在中使用 getServerSideProps。getServerSideProps中使用的导入将不会被删除 为客户端绑定

这意味着您可以直接在中编写服务器端代码 getServerSideProps。这包括从文件系统或 数据库

我不知道有什么方法可以让webpack捆绑文件的一部分或执行导入语句的子集

我希望这能提供一些帮助

参考资料:


如果您需要知道哪些功能绑定到客户端&哪些功能绑定到服务器,有一种简单的方法可以知道这一点→

只需将文件内容复制并粘贴到其中,您就会看到哪些代码绑定到客户端,哪些代码绑定到服务器。如果有导入,请确保将所有导入放在一个文件中,以便查看其工作方式

经验法则是:

任何类似于
getServerSideProps
getStaticProps
getstaticpath
的内容都将从绑定的代码中删除。如果您从使用服务器端代码(如
fs
)的文件导入任何内容,但在上述3个函数中均未使用该内容,则不会删除该内容(请在下一个代码消除工具中进行检查)&这将给您一个错误


工具就是答案。我复制并粘贴了我的文件,很快就找到了答案。

我问了一些其他问题。你所说的一切——我已经知道了。总结一下我的问题:一个从未从客户端代码调用的函数是否会被绑定并发送到客户端?一个从未从客户端调用的函数仍然可以被绑定并发送到浏览器。如果不希望发生这种情况,最好使用动态导入。您可以检查是否在浏览器中运行代码,并决定在服务器上导入代码。服务器端功能将被捆绑到一个单独的块中。如果加载逻辑正确,函数的块将不会加载到浏览器中。我希望这个答案对你的问题更有意义。我不明白为什么一个“死代码”(一个从未从客户端代码引用过的函数)会被捆绑并发送到浏览器。我认为整个想法是,您可以在任何地方编写JS,并从客户端和服务器调用函数,但是如果客户端没有使用函数,为什么要将其发送到浏览器?我想我真的不明白它是怎么工作的。所以,如果我不想捆绑这个功能,我只需要剪切并粘贴到其他文件?谢谢!为了确保我理解正确,如果我导入一个函数并从客户端代码中调用它(比如从react组件的渲染函数),并且在这个函数文件中还有另外两个函数从未从客户端代码调用过,它们将不会捆绑并发送到客户端对吗?@user334396是,我认为它不会被捆绑,因为它是死代码,因为
Next.js
使用
webpack
underhood。尽管如此,我认为你可以通过自己做来核对。只需制作一个示例应用程序并尝试这样做。