Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaScript模块的同构JavaScript库-在浏览器中省略Node.js依赖项?_Javascript_Node.js_Browser_Isomorphic Javascript - Fatal编程技术网

使用JavaScript模块的同构JavaScript库-在浏览器中省略Node.js依赖项?

使用JavaScript模块的同构JavaScript库-在浏览器中省略Node.js依赖项?,javascript,node.js,browser,isomorphic-javascript,Javascript,Node.js,Browser,Isomorphic Javascript,因此,我计划编写一个包,希望用户能够在Node.js和浏览器中使用该包 在Node.js端,它将使用fs模块。这可能不存在于浏览器中。这可以通过CommonJS实现,CommonJS带有一个if子句来检查模块所处的环境,以及一个简单的require 起吊时,import的情况并非如此 有人知道如何构造代码或构建环境以满足同一个包中的两个环境吗?坚持ES6导入 Node.js中的import支持似乎有所改进: --实验模块标志可用于支持 ECMAScript模块(ES模块) 一旦启用,Node.j

因此,我计划编写一个包,希望用户能够在Node.js和浏览器中使用该包

在Node.js端,它将使用
fs
模块。这可能不存在于浏览器中。这可以通过CommonJS实现,CommonJS带有一个
if
子句来检查模块所处的环境,以及一个简单的
require

起吊时,
import
的情况并非如此

有人知道如何构造代码或构建环境以满足同一个包中的两个环境吗?

坚持ES6导入 Node.js中的
import
支持似乎有所改进:

--实验模块
标志可用于支持 ECMAScript模块(ES模块)

一旦启用,Node.js将在 作为初始输入传递给节点,或在导入引用时传递给节点 ES模块代码中的语句:

  • .mjs
    结尾的文件

  • 当最近的父级
    package.json
    文件包含带有
    “模块”
    的值

  • 字符串作为参数传递给
    --eval
    --print
    ,或通过
    STDIN
    管道传递到节点,标记为
    --input type=module

列出的第二种方法可用于node.js。只需确保库的
包.json
包含
“类型”:“模块”
,节点应将其视为ES6模块,而不是CommonJS

有条件导入作为承诺-您必须等待 条件导入已在节点中可用,但实际上不受支持。它们似乎在浏览器中工作。还有一个警告:导入的模块是一个承诺。这意味着,只要计划好步骤,就可以拥有部分同构的代码。知道您可以在浏览器中执行
导入(“test.js”)
,并且可以测试
窗口
,意味着您可以以智能方式编写条件,并拥有跨平台代码

例如,您可以执行以下操作:

if (typeof window !== 'undefined') const FooPromise = import("foo");

但并非相反。祝你好运希望更多对es6动态导入的支持将出现在node上。

这不是问题所在。问题是如何基于环境有条件地导入模块。例如,
if(typeof window!=='undefined')从'bar'导入{Foo}
注意,这在commonjs中是可能的:
if(typeof window!=='undefined')Foo=require('bar')
@slebetman我知道在commonjs中是可能的,但是如何以ES2015的方式使用
导入
<代码>导入被提升,因此if子句不起作用。哦,是的,我现在明白了。我和你面临同样的问题。始终希望在节点和浏览器中使用不同的模块。例如,
fetch
API的polyfill。让我做更多的研究好吧,如果您的软件包确实需要
fs
,那么它如何在浏览器中工作?如果您的软件包不需要
fs
,那么它使用的是什么呢?@Bergi I有两个功能,一个是记录文件(使用
fs
),另一个是记录控制台。浏览器环境将忽略对文件的记录,而只记录到控制台。节点环境将使用这两个函数。这就是一个例子。你的意思是你的浏览器包与你的节点包有不同的界面,根本不包含文件记录功能吗?@Bergi类似的例子。我想知道其他人在这种情况下会怎么做。我只知道三件事。1) 创建到npm包,一个用于节点,一个用于浏览器2)polyfills(但在这种情况下没有意义)3)使用require(不过节点将使用javascript模块)。是的,在这种情况下,我认为应该创建两个不同的模块(或者一个模块具有两个不同的入口点)。nodejs one可以从另一个文件重新导出控制台日志记录功能。