使用JavaScript模块的同构JavaScript库-在浏览器中省略Node.js依赖项?
因此,我计划编写一个包,希望用户能够在Node.js和浏览器中使用该包 在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
fs
模块。这可能不存在于浏览器中。这可以通过CommonJS实现,CommonJS带有一个if
子句来检查模块所处的环境,以及一个简单的require
起吊时,import
的情况并非如此
有人知道如何构造代码或构建环境以满足同一个包中的两个环境吗?坚持ES6导入
Node.js中的import
支持似乎有所改进:
--实验模块
标志可用于支持
ECMAScript模块(ES模块)
一旦启用,Node.js将在
作为初始输入传递给节点,或在导入引用时传递给节点
ES模块代码中的语句:
- 以
结尾的文件.mjs
- 当最近的父级
文件包含带有package.json
的值“模块”
- 字符串作为参数传递给
或--eval
,或通过--print
管道传递到节点,标记为STDIN
--input type=module
包.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可以从另一个文件重新导出控制台日志记录功能。