为什么引入 npm 包 我们能引入直接使用

3,128 阅读1分钟

在使用 npm 包的时候我很好奇一件事情, 为什么我们 npm install 到 node_module 之后我们能直接 var bar = require('bar')

我们使用的是 CommonJS 模块化 规范 目录结构

    --demo
        --node_module  //可以手动创建文件夹
            --bar.js
        --demo.js

bar.js

    var str = {
        str: '我是在 node_module 下bar.js'
    }
    exports.str = str // 必须用模块化标准 导出来

demo.js

    var str = require('bar')  //后缀名可以省略
    console.log(str)    //     { str: { str: '我是在 node_module 下bar.js' } }

数据的结果是 { str: { str: '我是在 node_module 下bar.js' } }

这样我们 用的时候就需要 str.str 这样就很不友好了。

我们换一种导出的方法

bar.js

    var str = {
        str: '我是在 node_module 下bar.js'
    }
    module.exports = str // 必须用模块化标准 导出来

大家可以了解一下 模块化 导出 引入的一些细节

初步的我们已经能实现了 如果我们改变一下目录结构

    --demo
        --node_module  //可以手动创建文件夹
            --bar
                --bar.js
        --demo.js

demo.js 引入的时候也要相应做一下处理

    var str = require('bar/bar')  //后缀名可以省略
    console.log(str)    //     { str: { str: '我是在 node_module 下bar.js' } }

这好像也不是我们要的效果,重要的步骤要来了

我们要在 node_module 下边的 bar 文件夹下边 创建一个 package.json 文件

执行 npm init -y 表示不需要提示直接创建 package.json 文件

{
  "name": "bar",
  "version": "1.0.0",
  "description": "",
  "main": "bar.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

注意 我们 入口 main 已经指定了文件夹了

所以我们在用的时候就能实现

    var str = require('bar')  //后缀名可以省略
    console.log(str)    //     { str: { str: '我是在 node_module 下bar.js' } }