es6 import 和node 的require

服务器端 node的module遵循CommonJS规范,浏览器端 requirejs遵循AMD,seajs遵循CMD

在node模块中,采用的是CommonJS规范,使用require引入模块,使用module.exports导出接口。

ES6标准发布后,module成为标准,使用import引入模块,使用export指令导出接口,

// a.js

// -------- node -----------

module.exports = {

a : function() {},

b : ‘xxx‘

};

// ----------- AMD or CMD ----------------

define(function(require, exports, module){

module.exports = {

a : function() {},

b : ‘xxx‘

};

});

// b.js

// ------------ node ---------

var m = require(‘./a‘);

m.a();

// ------------ AMD or CMD -------------

define(function(require, exports, module){

var m = require(‘./a‘);

m.a();

});

在浏览器端的模块中要使用一个define函数来提供模块的闭包以外,其他代码可以完全一致。

node中的module采用CommonJS规范,require只是node的一个私有的全局方法,module.exports也只是node私有的一个全局变量属性

ES6发布的module并没有直接采用CommonJS,甚至连require都没有采用,也就是说,跟标准半毛钱关系都没有。

  1. export导出模块接口(在要导出的接口前面,加入export指令。)

    export default function() {}

    export function a () {}

    var b = ‘xxx‘;

    export {b}; // 这是ES6的写法,实际上就是{b:b}

    export var c = 100;

  2. export 的错误的用法

    export 1; // 绝对不可以

    var a = 100; // 不可以

    export a;

    export在导出接口的时候,必须与模块内部的变量具有一一对应的关系。export a 虽然看上去成立,但是 a 的值是一个数字,根本无法完成解构,因此必须写成 export {a} 的形式。即使a被赋值为一个function,也是不允许的。大部分风格都建议,模块中最好在末尾用一个export导出所有的接口,例如:export {fun as default,a,b,c};

  3. import导入模块(import的语法跟require不同,而且import必须放在文件的最开始,import后面跟上花括号的形式是最基本的用法,花括号里面的变量与export后面的变量一一对应)

    import $ from ‘jquery‘;

    import * as _ from ‘_‘;

    import {a,b,c} from ‘./a‘;

    import {default as alias, a as a_a, b, c} from ‘./a‘;

    as 关键字,取别名

    default关键字,其实是别名的语法糖, 这个语法糖的好处就是import的时候,可以省去花括号{};import $,{each,map} from ‘jquery‘;import后面第一个 $ 是 {defalut as $} 的替代写法。

    通过*号直接继承某一个模块的接口(尽可能少用,它实际上是使用所有export的接口,但是很有可能你并不会用到所有接口,可能仅仅是一个)

  4. 用require还是import?

    require使用简单,相当于module.exports的传送门,module.exports后面的内容是什么,require的结果就是什么,对象、数字、字符串、函数……再把require的结果赋值给某个变量,相当于把require和module.exports进行平行空间的位置重叠。而且require理论上可以运用在代码的任何地方,甚至不需要赋值给某个变量之后再使用,

    比如:require(‘./a‘)(); // a模块是一个函数,立即执行a模块函数var data = require(‘./a‘).data; // a模块导出的是一个对象;var a = require(‘./a‘)[0]; // a模块导出的是一个数组

    你在使用时,完全可以忽略模块化这个概念来使用require,仅仅把它当做一个node内置的全局函数,它的参数甚至可以是表达式:require(process.cwd() + ‘/a‘);

    但是import则不同,它是编译时的(require是运行时的),它必须放在文件开头,而且使用格式也是确定的,不容置疑。它不会将整个模块运行后赋值给某个变量,而是只选择import的接口进行编译,这样在性能上比require好很多。

    从理解上,require是赋值过程,import是解构过程,当然,require也可以将结果解构赋值给一组变量,但是import在遇到default时,和require则完全不同: var $ = require(‘jquery‘); 和 import $ from ‘jquery‘ 是完全不同的两种概念。

    还是没有回答“改用require还是import?”这个问题因为目前所有的引擎都还没有实现import,我们在node中使用babel支持ES6,也仅仅是将ES6转码为ES5再执行,import语法会被转码为require。这> 也是为什么在模块导出时使用module.exports,在引入模块时使用import仍然起效,因为本质上,import会被转码为require去执行。

    现在开始使用import

原文地址:https://www.cnblogs.com/winner-chicken/p/8550675.html

时间: 2024-10-11 16:05:47

es6 import 和node 的require的相关文章

ES6 import 引用文件夹/目录及其处理过程

1.现象 看redux的时候发现官网的教程里直接import了一个文件夹,我再三确定没有看错, 是一个 文件夹 (Directory), 它直接 import了一个目录!这个 文件夹/目录 底下还有一个index.js文件. js文件只能用index.js,换其他名字都会报错.我使用的是webpack + babel-loader来编译它的,也许是webpack或者是babel的某个设定而不是ES6 import本身的,总之这样是可以用的. 我也发现了这个问题,import是可以导入目录的,我看

[Node.js] Testing ES6 Promises in Node.js using Mocha and Chai

Writing great ES6 style Promises for Node.js is only half the battle. Your great modules must include tests as well to ensure future iterations don't break them. In this lesson, I show you a simple ES6 Promise in Node.js, then walk you through creati

Amd,Cmd, Commonjs, ES6 import/export的异同点

Amd,Cmd, Commonjs, ES6 import/export等均是模块化方案 1.Commonjs使用在Nodejs上,加载模块是同步的. 2.Amd是requirejs在推广过程中对模块定义的规范化产出,异步模块定义,requirejs是对这个概念的实现,好比JavaScript语言是对ECMAScript规范的实现. 3.Cmd是seajs在推广过程中对模块定义的规范化产出,是一个同步模块定义,seajs是cmd概念的一个实现,seajs是淘宝团队提供的一个模块开发的js框架.

node.js require() 源码解读

时至今日,Node.js 的模块仓库 npmjs.com ,已经存放了15万个模块,其中绝大部分都是 CommonJS 格式.这种格式的核心就是 require 语句,模块通过它加载.学习 Node.js ,必学如何使用 require 语句.本文通过源码分析,详细介绍 require 语句的内部运行机制,帮你理解 Node.js 的模块机制. 一.require() 的基本用法分析源码之前,先介绍 require 语句的内部逻辑.如果你只想了解 require 的用法,只看这一段就够了.下面的

关于ES6 import命令的一个补充

问题 今天查阅资料时发现,无论是阮一峰还是Mozilla网站有关ES6 import命令介绍部分都没有细致地提供这个命令后面可以跟一个文件路径的更多的细节. 其实,import命令一个典型的表达是其后面的from子句中可以直接跟一个路径(也常常跟一个省略.js扩展名的JS模块文件名). 此时,ES6在解析时会到指定路径下查找一个名字为index.js的文件.注意:js文件只能用index.js,换其他名字都会报错!!! 典型应用 有关import命令的上述情况的一个典型应用是,把此文件夹下其他.

es6 import

最近用reactjs写个h5 应用,封装一个model.然而使用这个model时候 总是报错: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined.... 什么一开始还以为是style啥的 语法错误了,还真有! 然而 这个错误还是存在,stack overflow下 没啥结果.突然

ES6 import and export

定义: 用来导入或者导出模块. ES6 的模块自动采用严格模式,不管你有没有在模块头部加上"use strict";. 严格模式主要有以下限制. 变量必须声明后再使用 函数的参数不能有同名属性,否则报错 不能使用with语句 不能对只读属性赋值,否则报错 不能使用前缀 0 表示八进制数,否则报错 不能删除不可删除的属性,否则报错 不能删除变量delete prop,会报错,只能删除属性delete global[prop] eval不会在它的外层作用域引入变量 eval和argumen

Node中require第三方模块的规则

Node.js中使用CommonJs模块化机制,通过npm下载的第三方包,我们在项目中引入第三方包都是:let xx = require('第三方包名'),究竟require方法加载第三方包的原理机制是什么,今天我们来探讨下. require('第三方包名')优先在加载该包的模块的同级目录node_modules中查找第三方包. let template = require('art-template') //加载第三方包 找到该第三方包中的package.json文件,并且找到里面的main属

ES6 import export

export deault function() { }; import './a'; //表示直接执行a.js中的内容 import A from './a'; //不加{}表示a.js中使用的是export default import {A,B} from './a'; //a.js暴露了A和B import * as AA from './a';