天天看點

帶你了解NodeJs的子產品系統

前言

在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"
}