前言
在JavaScript語言中,兩個獨立的js腳本互相引用是無法實作的,隻能在Html頁面中引入多個腳本來做到關聯。
NodeJs提供了一個簡單的子產品系統,它讓Js代碼之間可以互相引用,友善暴露自己的調用方法給别人使用。
引入子產品示例A
檔案名:jsjiami.js
exports.hello = function() {
console.log('Hello World');
}
exports.jiami = function (code) {
return `js一鍵加密 | jsjiami.com -> ${code}`;
}
/*----------*/
/*const CORE = {
test: function () {
console.log('test');
},
test1: function () {
console.log('test1');
}
}
module.exports = CORE;*/
檔案名:main.js
const {jiami, hello} = require("./test/jsjiami");
const str = jiami('js一鍵加密 | jsjiami.com');
console.log(str);
hello();
/*
const CORE = require('./test/jsjiami');
CORE.test1();
*/
敲代碼一定要多動手,以上代碼可以丢到編譯器中運作一下試試是否正常運作,作者用的是WebStorm。
示例A解析
以上示例很簡單,通過exports導出了一個名字為jiami的函數,将該函數暴露了出去。
然後在main.js檔案中引用了這個函數,通過的require關鍵詞和**{}**将需要引入的函數引入進來就可以直接使用了。
或者看注釋部分,也可以不用**{}**,直接引入當變量調用方法。
引入子產品示例B
檔案名:jsjiemi.js
export const hello = function () {
console.log('hello word');
}
export const jsjiemi = function () {
return 'js一鍵解密 | jsjiami.com';
}
export default {
test: function () {
console.log('test');
},
test1: function () {
console.log('test1');
},
jsjiemiDefault: jsjiemi
}
檔案名:main.js
import {jsjiemi, hello} from "./test/jsjiemi.js";
const str = jsjiemi();
console.log(str);
hello()
import CORE from "./test/jsjiemi.js";
CORE.test();
CORE.test1();
const str1 = CORE.jsjiemiDefault();
console.log(str1);
依然按照慣例啊,敲代碼的,能動手就動手,先跑一邊,再分析,建議各位先丢到自己的編譯器中跑一下試試手感。
示例B解析
該執行個體是用import關鍵詞來引入方法的,通過export關鍵詞暴露函數。
export 後邊必須跟的是申明,不可以是變量。
import 在**{}**内引入指定js檔案暴露出的方法,沒暴露的無法引用。
export default 後邊必須跟一個對象,對象裡邊是你想暴露的任意代碼或變量。
import xxx 不用**{}直接自定義一個變量的用法,是結合export default一起用的,必須有export default**才可以直接自定義一個變量去接受暴露的函數。
總結(有彩蛋)
以上介紹了NodeJs兩種子產品暴露和導入的方式。
我相信如果跟着我動手的讀者會發現,示例2是會報錯的,為什麼呢?接下來為您解答哈哈。
NodeJs在更新14版本以後,分成了2種子產品規範,一種是CJS,一種是ESM。
而上述示例代碼中,示例A是CJS規範的,示例B是ESM規範的。
{
"name": "bet",
"version": "1.0.0",
"description": "",
"main": "index.js",
"type": "commonjs", // commonjs=CJS module=ESM
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "jsjiami.com",
"license": "ISC"
}