当前位置: 首页 > 科技观察

太棒了,新的ECMAScript提案:JSON模块

时间:2023-03-15 20:40:18 科技观察

ECMAScript模块系统(import和export关键字)默认只能导入JavaScript代码。但是,将应用程序的配置保存在JSON文件中通常很方便,因此我们可能希望将JSON文件直接导入到ES模块中。commonjs模块格式早就支持导入JSON。好消息是,第三阶段的一项名为JSONModules的新提案提出了一种将JSON导入ES模块的方法。现在,让我们看看JSON模块是如何工作的。1.导入config.json。假设我们有一个config.json文件,内容如下:{"name":"MyApplication","version":"v1.2"}如何将config.json导入到ES模块中?例如,我们创建一个简单的Web应用程序,它显示来自JSON配置文件的应用程序名称和版本。如果您尝试直接导入config.json,Node.js将抛出错误。importhttpfrom'http';importconfigfrom'./config.json';http.createServer((req,res)=>{res.write(`Appname:${config.name}\n`);res.write(`Appversion:${config.version}`);res.end();}).listen(8080);node.js抛出错误TypeError[ERR_UNKNOWN_FILE_EXTENSION]:Unknownfileextension".json"Node.js使用import语句时,默认需要JavaScript代码。但多亏了JSON模块提案,您可以指明要导入的数据类型:JSON。在修复应用程序之前,让我们看一下JSON模块提案有哪些内容。2.JSON模块提案JSON模块提案的本质是允许使用常规导入语句在ES模块中导入JSON数据。可以通过添加导入断言来导入JSON内容:importjsonObjectfrom"./file.json"assert{type:"json"};assert{type:"json"}是一个导入断言,表明模块应该被解析并导入为json。jsonObject变量包含解??析file.json内容后创建的普通JavaScript对象。JSON模块的内容使用默认值导入,命名导入不可用。JSON模块也可以动态导入:const{default:jsonObject}=awaitimport('./file.json',{assert:{type:'json'}});当动态导入模块时,包括JSON模块,默认内容在default属性中可用。在这种情况下,导入断言表示JSON类型。然而,有一个更通用的导入断言的提议(目前处于第3阶段)允许导入更多数据格式,例如CSS模块。3.启用JSON模块现在我们将JSON模块集成到Web应用程序中:importhttpfrom'http';importconfigfrom'./config.json'assert{type:"json"};http.createServer((req,res)=>{res.write(`Appname:${config.name}\n`);res.write(`Appversion:${config.version}`);res.end();}).listen(8080);主模块现在导入config.json文件,并访问其值config.name和config.version。JSON模块工作在Node.js版本>=17.1,也可以使用--experimental-json-modules标志节点启用ExperimentalJSON模块--experimental-json-modulesindex.mjs在浏览器环境下,JSON模块从Chrome91开始可用。4.总结默认情况下,ES模块只能导入JavaScript代码。感谢JSON模块提案,您可以直接将JSON内容导入ES模块。只需在import语句之后使用import断言。importjsonContentfrom"./file.json"assert{type:"json"};从Node.js17.1开始,您可以使用JSON模块,使用实验标志--experimental-json-modules,并在Chrome91及更高版本中使用。作者:DmitriPavlutin译者:前端小智来源:dmitripavlutin原文:https://dmitripavlutin.com/javascript-json-modules/