关于import:ES-modules的导出方式

Named Exports// module1.jsexport const name = 'Ben';// app.jsimport { name } from './module1.js'console.log(name);// Ben// module1.jsconst name = 'Ben';export { name };// app.jsimport { name } from './module1.js'console.log(name);// Ben通过观察下面的代码咱们发现,该形式导出的模块内容,必须用解构的形式拜访,也就是无奈间接用module1.name这样的形式拜访。 Default ExportsDefault Exports的导出形式,刚好能够补充Named Exports的对象拜访形式。 // module1.jsconst name = 'Ben';export default { name};// app.jsimport module1 from './module1.js'console.log(module1.name);// Ben其它对于Named Exports的导出形式,如果非要应用对象的拜访形式,则能够应用* as xxx语法,将模块中所有Named Exports导出的数据合并为一个对象,来达到目标。 // module1.jsexport const name = 'Ben';// app.jsimport * as obj from './module1.js'console.log(obj.name);// Ben

February 20, 2024 · 1 min · jiezi

关于import:Threejs-之-Import-Model-导入模型

导入模型Three.js 提供了很多原始模型,但如果咱们须要更简单的模型,最好应用 3D 软件建模,而后导入到场景中。本节咱们就来学学如何导入一个做好的 3D 模型。3D 模型的各种格局3D 模型有各种各样的格局,详情可参考维基百科List_of_file_formats#3D_graphics。这些格局各有特点。接下来咱们列举一些比拟常见和风行的。 OBJFBXSTLPLYCOLLADA3DSGLTF 咱们不会关怀所有的模型。因为 GLTF 模型曾经逐步变为规范,并且能应答绝大部分你遇到的场景。GLTFGLTF 是 GL Transmission Format 的缩写。由 Khronos Group 发明(他们还发明了 OpenGL, WebGL, Vulkan, Collada 并且有很多成员在 AMD / ATI, Nvidia, Apple, id Software, Google, Nintendo, etc 公司 )。GLTF 在近些年曾经变得越来越风行。它能够反对各种数据集,你能够在其格局中应用几何体和材质,同时也能够蕴含相机、光照、场景、动画、骨骼等。同时反对各种文件格式,例如 json、二进制 binary、embed texture 嵌入纹理等。GLTF 曾经成为了实时渲染的规范,并且也正在成为大部分3D软件、游戏引擎和库的规范模型。这意味着你能够轻松的在各个环境中纯熟应用它。但这并不是说 GLTF 能够笼罩所有场景,如果你仅仅是须要一个几何体,那么能够抉择 OBJ、FBX、STL 或 PLY 格局。寻找一个模型咱们后续会学习在 Blender 中创立模型,但当初咱们先寻找一个创立好的模型。咱们能够在 GLTF 团队的示例中看到各种各样的模型。链接为 glTF Sample Models。首先咱们动一个简略的小黄鸭模型作为示例开始动手。 GLTF formats尽管 GLTF 就是一种格局,然而其外部蕴含了其余格局。咱们会发现有很多文件夹,如下图 咱们来说说这些都是什么 glTFglTF-BinaryglTF-DracoglTF-Embedded glTFglTF 是默认格局。Duck.gltf 是一个 JSON 文件。蕴含了各种信息,蕴含相机、光照、场景、材质等,但没有几何体或纹理贴图。Duck0.bin 是一个二进制文件。通常蕴含了几何体和UV贴图坐标、法线坐标等。DuckCM.png 是鸭子的纹理贴图。当咱们载入 Duck.gltf 时,它会主动载入其余两个文件。glTF-Binary蕴含了所有上述的数据,是个二进制文件,不能间接关上。这个文件格式会更轻量化一些,只有一个文件,也易于载入。但不太不便批改外部的数据。例如你想批改纹理贴图,换一张更压缩的贴图时,就会比拟麻烦,因为这些数据都是被汇合在了一起,同一个二进制文件中。glTF-Draco有点像说的第一个格局,不过应用了 Draco algorithm 来压缩几何体的数据。如果你比照 .bin 文件的大小,你就会发现这个会更小一点。glTF-Embedded这个格局有点像 glTF-Binary 因为也是只有一个文件。但这个文件是一个 JSON 因而你能够在编辑器里关上。抉择适合的模型格局依据不同场景做出不同的抉择才是最优计划。如果你想批改 textures 或导出的光线坐标,最好抉择第一个默认的 glTF。它还具备别离加载不同文件的劣势,从而进步了加载速度。如果想要每个模型一个文件,并且不关怀模型内的素材批改,那么二进制 glTF-Binary 更适宜。在这两种状况下,您都必须决定是否要应用 Draco 压缩,但咱们稍后会介绍这部分。导入模型的实际筹备咱们筹备一个空白的立体、环境光和平行光。初始代码如下:import * as THREE from 'three'import './style.css'import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'import * as dat from 'lil-gui'import stats from '../common/stats'import { listenResize } from '../common/utils' ...

August 10, 2022 · 3 min · jiezi

import提升导致Fundebug报错:“请配置apikey”

摘要: 解释一下“请配置apikey”报错的原因。部分Fundebug用户使用import来导入js文件时,出现了"请配置apikey"的报错,这是由于import提升导致的,下面我会详细解释一下这一点。import提升关于import提升,我们可以参考阮一峰的《ECMAScript 6 入门》。import命令具有提升效果,会提升到整个模块的头部,首先执行。foo();import { foo } from ‘my_module’;上面的代码不会报错,因为import的执行早于foo的调用。这种行为的本质是,import命令是编译阶段执行的,在代码运行之前。因此,即使我们把import语句写在后面,它仍然会在其他语句之前执行。import提升为何导致Fundebug报错?Fundebug用户应该清楚,在接入fundebug-javascript插件之后,需要配置apikey,如下:import * as fundebug from “fundebug-javascript”;fundebug.apikey = “API-KEY”;假设我们还需要import一个test.js文件,这个文件会抛出一个Error,如下:// test.jsthrow new Error(“test”)一切看起来没有问题:// main.jsimport * as fundebug from “fundebug-javascript”;fundebug.apikey = “API-KEY”;import “./test"但是,根据import提升,代码的实际执行顺序如下:// main.jsimport * as fundebug from “fundebug-javascript”;import “./test"fundebug.apikey = “API-KEY”;这种情况下,第二行代码就会抛出错误,导致apikey复制语句不会执行,从而导致报错:“请配置apikey”。这个问题并不需要解决出于测试的目的,用户会去import一个立即报错的js文件,类似于前文提到的test.js。但是实际开发中,我们不可能这样做,否则应用会立即崩溃,更谈不上部署了。我们写这篇博客的目的仅仅是解释一下原因,并分享一个非常简单的知识点“import提升”。如何规避这个问题?仅供参考,实际上没有必要这样做。新建一个配置文件config.js,在这个文件中配置apikey:fundebug.apikey = “API-KEY”;import配置文件:// main.jsimport * as fundebug from “fundebug-javascript”;import “./config"import “./test"这种情况下,配置apikey的语句被import代替了,也就不存在所谓"import提升"的问题,Fundebug将可以正常报错。最后,感谢Fundebug用户龙哥的反馈和协助!参考《ECMAScript 6 入门》Fundebug文档 - JavaScript错误监控插件关于FundebugFundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java线上应用实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了10亿+错误事件,付费客户有Google、360、金山软件、百姓网等众多品牌企业。欢迎大家免费试用!版权声明转载时请注明作者Fundebug以及本文地址:https://blog.fundebug.com/2019/02/26/import-cause-fundebug-apikey-error/

February 28, 2019 · 1 min · jiezi

JS module的导出和导入

最近看了些Vue框架写的程序,发现自己的前端知识还停留在几年以前,发现现在Javascript程序里有各种各样的对module的导入和到处,导入乍一看跟python的语法挺像的无非就是把from和import这两个关键词的使用颠倒了一下顺序。仔细看下来还是和python挺不一样的import模块的前提是模块有导出,并且还分默认导出和命名导出,有些麻烦。所以今天这篇文章就把所有的export形式和相应的import使用汇总一下。ES6在语言标准的层面上,实现了模块功能,成为浏览器和服务器通用的模块解决方案,完全可以取代 CommonJS 和 AMD 规范,基本特点如下:每一个模块只加载一次, 每一个JS只执行一次, 如果下次再去加载同目录下同文件,直接从内存中读取;每一个模块内声明的变量都是局部变量, 不会污染全局作用域;模块内部的变量或者函数可以通过export导出;一个模块可以导入别的模块2.模块功能主要由两个命令构成:export和import。export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能;3.一个模块就是一个独立的文件,该文件内部的所有变量,外部无法获取。如果你希望外部能够读取模块内部的某个变量,就必须使用export关键字输出该变量;var year = ‘2018’;var month = ‘Febuary’;export {year, month};export 导出模块export语法声明用于导出函数、对象、指定文件(或模块)的原始值。 有两种模块导出方式:命名式导出(名称导出)和默认导出(定义式导出),命名式导出每个模块可以有多个,而默认导出每个模块仅一个 。命名式导出模块可以通过export前缀关键词声明导出对象,导出对象可以是多个。这些导出对象用名称进行区分,称之为命名式导出export { func }; // 导出一个已定义的函数funcexport const foo = Math.sqrt(100); // 导出一个常量我们可以使用和from关键字来实现的模块的继承:export * from ‘base_module’;模块导出时,可以指定模块的导出成员。导出成员可以认为是类中的公有成员,而非导出成员可以认为是类中的私有成员:var name = ‘Kevin的居酒屋’;var domain = ‘http://coffee.toast.com’; export {name, domain}; // 相当于导出{name:name,domain:domain}模块导出时,我们可以使用as关键字对导出成员进行重命名,上面的导出可以这样写:export {name as siteName, domain}注意一下语法错误:export 1; var a = 100;export a;export在导出接口的时候,必须与模块内部的变量具有一一对应的关系。直接导出1没有任何意义,也不可能在import的时候有一个变量与之对应export a虽然看上去成立,但是a的值是一个数字,根本无法完成解构,因此必须写成export {a}的形式。即使a被赋值为一个函数,也是不建议使用上面的形式导出的因为大部分风格都建议,模块中最好在末尾用一个export导出所有的接口,就像上面那些例子一样。默认导出默认导出也被称做定义式导出。命名式导出可以导出多个值,但在import引用时,也要使用相同的名称来引用相应的值。默认导出只有导出一个单一值,这个输出可以是一个函数、类或其它类型的值,这样在模块import导入时也会更 容易引用。export default function() {}; // 导出一个函数export default class(){}; // 导出一个类默认导出可以理解为另一种形式的命名导出,默认导出可以认为是使用了default名称的命名导出。下面两种导出方式是等价的:const D = 123; export default D;export { D as default };使用名称导出一个模块时:// “my-module.js” 模块function cube(x) { return x * x * x;}const foo = Math.PI + Math.SQRT2;export { cube, foo };在另一个模块(js文件)中,我们可以像下面这样引用:import { cube, foo } from ‘my-module’;console.log(cube(3));console.log(foo);使用默认导出一个模块时:// “my-module.js"模块export default function (x) {return x * x * x;}在另一个模块中,我们可以像下面这样引用,相对名称导出来说使用更为简单:import cube from ‘my-module’;console.log(cube(3)); // 27import导入模块import语法声明用于从已导出的模块、脚本中导入函数、对象、指定文件(或模块)的原始值。import模块导入与export模块导出功能相对应,也存在两种模块导入方式:命名式导入(名称导入)和默认导入(定义式导入)。注意事项: import必须放在文件的最开始,且前面不允许有其他逻辑代码,这和其他所有编程语言的导入风格一致。命名导入我们可以通过指定名称将导入成员插入到当作用域中。可以导入单个成员或多个成员:注意,花括号里面的变量与export后面的变量一一对应import {myMember} from “my-module”;import {foo, bar} from “my-module”;通过符号,我们可以导入模块中的全部属性和方法。当导入模块全部导出内容时,就是将导出模块(’my-module.js’)所有的导出绑定内容,插入到当前模块(’myModule’)的作用域中:import * as myModule from “my-module”;默认导入在模块导出时,可能会存在默认导出。同样的,在导入时可以使用import指令导入这些默认值。直接导入默认值:import defaultName from “my-module”;import myDefault, {foo, bar} from “my-module”; // 指定成员导入和默认导入default关键字// my-module.jsexport default function() {} // 等效于:function func() {};export {func as default};在import的时候,可以这样用:import a from ‘./my-module’; // 等效于,或者说就是下面这种写法的简写import {default as a} from ‘./my-module’;这个语法糖的好处就是import的时候,可以省去{}。简单的说,如果import的时候,你发现某个变量没有花括号括起来(没有*号),那么你在脑海中应该把它还原成有花括号的{default as …}语法,所以import $,{each,map} from ‘jquery’;import后面第一个$是{default as $}的替代写法。 ...

February 24, 2019 · 1 min · jiezi

golang 之 import 和 package 的使用

golang 使用包 package 来管理定义模块,可以使用 import 关键字来导入使用。如果导入的是 go 自带的包,则会去安装目录 $GOROOT/src 按包路径加载,如 fmt 包如果是我们 go get 安装或自定义的包,则会去 $GOPATH/src 下加载package 的定义go import 的包是由 包路径/包名 组合而成的,例如导入我们自定义的 baz 包,包路径为 $GOPATH/src/foo/bar/baz,baz 包的源码都存放在此目录下。我们需要规范的将 baz 包中源码的 package 定义为 baz,就定义好一个可 import 载入的的包了。hello 模块//$GOPATH/src/foo/bar/baz/hello.gopackage bazimport ( “fmt”)// 模块初始化函数 import 包时被调用func init() { fmt.Println(“hello module init function”)}func Hello() { return “hello”}world 模块//$GOPATH/src/foo/bar/baz/world.gopackage bazimport ( “fmt”)// 模块初始化函数 import 包时被调用func init() { fmt.Println(“world module init function”)}func World() string { return “world”}package mainimport ( “fmt” “foo/bar/baz” //引入我们自定义的包)func main() { fmt.Println(baz.Hello(), baz.World())}import的使用普通操作import ( “fmt” “log” “foo/bar/baz”)普通导入就是按照加载机制,将要使用的包导入进来,然后使用 packageName.MethodName 的方式调用包内的方法即可。注意如果要包方法在其他包中可以调用,包方法需要首字母大写,例如:fmt.Println() fmt.Printf()。别名操作package mainimport ( “fmt” myBaz “foo/bar/baz”)func main() { fmt.Println(myBaz.Hello(), myBaz.World())}如果两个包的包名存在冲突,或者包名太长需要简写时,我们可以使用别名导入来解决。点操作package mainimport ( “fmt” . “foo/bar/baz”)func main() { fmt.Println(Hello(), World()) // 直接使用包内的方法即可 不需要显式使用包名}. 导入可以让包内的方法注册到当前包的上下文中,直接调用方法名即可,不需要再加包前缀。下划线操作package mainimport ( “fmt” _ “foo/bar/baz”)func main() { fmt.Println(baz.Hello(), baz.World()) // 错误 _ 并没有导入包 只是引入并执行包模块的 init 方法}_ 是包引用操作,只会执行包下各模块中的 init 方法,并不会真正的导入包,所以不可以调用包内的其他方法。相信对很多 phper 来说遵循 PSR4 的 Namespace 会将与路径紧密相关命名空间也作为类名的一部分,而 golang 则只将模块目录文件夹名作为包名,前面的路径只是用来导入而和包名无关,还是有一点点需要注意的。 ...

February 21, 2019 · 1 min · jiezi

ES6 export 和 export default的区别

ES6中 export 和 export default 与 import使用的区别,使用 react native 代码详解一、使用export 和 import1、export 定义导出一个子组件 Greetingimport React, { Component } from “react”;import { View, Text } from “react-native”;export class Greeting extends Component { render() { return( <View> <Text>{this.props.name}</Text> <View> ) }}2、在父组件中导入子组件import React, { Component } from “react”;import { View, Text } from “react-native”;// greeting文件存储在src目录下import { Greeting } from “./src/greeting”;import命令接受一对大括号,里面指定要从其他模块导入的变量名。大括号里面的变量名,必须与被导入模块(greeting.js)对外接口的名称Greeting相同。如果想为输入的变量重新取一个名字,import命令要使用as关键字,将输入的变量重命名import { bieming as Greeting } from “./src/greeting”;3、export default 场景:从前面的例子可以看出,使用import命令的时候,用户需要知道所要加载的变量名,否则无法加载。但是用户肯定不愿意去阅读子组件看看导出名称叫啥,然后回来导入,所以就有了 export default。import React, { Component } from “react”;import { View, Text } from “react-native”;export default class Greeting extends Component { render() { return( <View> <Text>{this.props.name}</Text> <View> ) }}4、import 导入模块import React, { Component } from “react”;import { View, Text } from “react-native”;// greeting文件存储在src目录下import Greeting from “./src/greeting”;// 或者import AnyName from “./src/greeting”;上面代码的import命令,可以用任意名称指向greeting.js输出的方法,这时就不需要知道原模块输出的变量名。需要注意的是,这时import命令后面,不使用大括号。总结:现在流行的前端框架,angular+ 主要使用 export 导出模块,react native 中使用 export default 导出模块,如今编辑器非常强大,安装插件会自动弹出模块名称,知道其导出怎么使用就可以了 ...

January 30, 2019 · 1 min · jiezi

webpack -- require和import机制

欢迎访问我的个人博客:http://www.xiaolongwu.cn前言虽然我们很多人每天都在写项目,require或者import写的爽得很,但还是有很大一部分人不清楚它背后的运行原理和所谓的规则机制。开始我们基于webpack开发,就拿基本的vue项目来举例子吧假如我们项目中要用到vue或者express框架,我们的代码就这样写import Vue from ‘vue’//或者var Vue = require(‘vue’)然后我们就能在下面轻松的用Vue这个变量,感觉很愉悦,但是你想过我们是怎么拿到Vue这个东西的吗?我们写的import或者require这行代码道理干了啥?首先,import是es2015的模块引入规范,而require是commonjs的模块引入规范;webpack支持es2015,commonjs,AMD等规范;工作机制前提是你在做web开发,试图用webpack或者rollup打包你的项目;首先会从本地的node_modules文件夹中找到vue文件夹,看是否存在package.json文件;如果找到了package.json,就会先找module字段,然后读取对应的路径下的文件,查找到此结束;如果没找到module字段,就会找main字段,然后读取对应的路径下的文件,查找到此结束;如果没有main字段,就会在vue文件夹下找index.js文件,然后读取文件,查找到此结束;如果以上都没找到就会返回异常,扔出not find异常如果不存在package.json就会找index.js文件,然后读取文件,查找到此结束;如果还没有就会抛出异常;简单说一下module字段说到module字段就不得不说一个和webpack很像的模块打包工具—rollup,rollup是一个轻量级的打包工具,一般被用来打包模块或者库,可以根据需要将模块打包为es,commonjs,AMD,CMD,UMD,IIFE等规范的模块;而webpack一般被用来打包应用程序;rollup提出了module这个字段,其原因是一般主流的模块或者库都是commonjs规范的模块,而es2015的模块规范才是js的未来,才应该是主流;所以,一般的package.json中的module对应的模块为es模块,而main对应的为commonjs模块,webpack和rollup都会默认优先读取module字段;github资源地址:webpack–require和import机制.md我的CSDN博客地址:https://blog.csdn.net/wxl1555如果您对我的博客内容有疑惑或质疑的地方,请在下方评论区留言,或邮件给我,共同学习进步。邮箱:wuxiaolong802@163.com

January 11, 2019 · 1 min · jiezi