一、import的使用限制
使用node xx.js運(yùn)行的文件,xx.js不能使用import導(dǎo)入其他文件,當(dāng)然,也不能使用export導(dǎo)出模塊,因為這是es6的語法,直接用node命令運(yùn)行肯定是行不通的。
// 例1:不論 a-1 是以何種方式導(dǎo)出的,都提示import的錯
import a1Module from './a-1'
console.log(a1Module);

// 例2:node中不能使用export導(dǎo)出模塊
// a-1.js
let name = 'jojo';
function sum(a, b) {
return a + b;
}
export {
name,
sum
}
// a-2.js
const a1Module = require('./a-1')
console.log(a1Module);

二、那webpack構(gòu)建的項目里,為什么就可以隨便使用require和import?
~我猜~:
(1)是在打包的過程中,通過獲取AST并修改節(jié)點,將import的方式都做了處理,node才能夠識別;
(2)通過babel進(jìn)行轉(zhuǎn)化的;
(3)那這就是webpack的處理機(jī)制了,在打包的過程中,會將import和export的語句最終處理或者轉(zhuǎn)化為node能夠識別的形式,所以整個系統(tǒng)才能夠順暢跑起來,完全就是webpack這個偉大構(gòu)建工具的功勞,讓我們的代碼的書寫不再單調(diào),底層和業(yè)務(wù)都可以靈活使用啦?。?!

~事實呢~:還需要再研究,等我后面整理了import的導(dǎo)入導(dǎo)出原理,估計就可以回答這個問題了!
反正就是要將
require、webpack、import這三個的原理串起來!
三 、NodeJS中的this為什么是一個空對象?
因為所有的NodeJS文件在執(zhí)行的時候都會被包裹到一個函數(shù)中, this都被修改為了空的module.exports,主要是利用了call/apply修改了this的指向,初始值指向一個空對象。
(function (exports, require, module, __filename, __dirname) {
// 我們編寫的代碼
// 所以說在這里面拿到的this就是 空的module.exports
});
compiledWrapper.call(module.exports, args);
四、NodeJS中為什么可以直接使用exports, require, module, __filename, __dirname?
因為所有的NodeJS文件在執(zhí)行的時候都會被包裹到一個函數(shù)中, 這些屬性都被通過參數(shù)的形式傳遞過來了
var args = [module.exports, require, module, filename, dirname];
compiledWrapper.apply(this.exports, args);
五、NodeJS中為什么不能直接exports賦值, 而可以給module.exports賦值?
因為直接賦值的方式就相當(dāng)于改變了exports的指向,不再指向module.exports上了,因此就不會修改module.exports的值,因此require拿到的就是一個空對象。
(function (exports, require, module, __filename, __dirname) {
exports = "jojo";
});
jsScript.call(module.exports, module.exports);
return module.exports;
相當(dāng)于
let exports = module.exports;
exports = "jojo";
return module.exports;