如何使用 npm 包依赖

Posted

技术标签:

【中文标题】如何使用 npm 包依赖【英文标题】:How to use npm package dependency 【发布时间】:2019-09-12 10:22:19 【问题描述】:

我正在学习通过创建会话检查函数sessionFn 来创建 npm 包,该函数将在会话到期前 1 分钟弹出一个模式。

该函数在主应用程序(nuxtJS 应用程序)上按预期工作,但是当我将它用作 npm 模块时,我必须将 moment 作为参数传递,即使 moment 被列为依赖项并被导入在模块上。

我遗漏了一些东西,为什么我的模块没有启动?我想使用sessionFn(this, to.path); 之类的模块,而不是sessionFn(this, to.path, moment);,当我不通过时,时刻未定义

包文件

package.json


  "name": "hello-stratech",
  "version": "1.0.17",
  "description": "Hello Stratech",
  "main": "index.js",
  "keywords": [
    "npm",
    "hello",
    "stratech"
  ],
  "author": "Simo Mafuxwana",
  "license": "ISC",
  "dependencies": 
    "moment": "^2.22.2"
  

index.js(主 js 文件)

import moment from "moment";

module.exports = 
  greeting(name) 
    alert("Hello.. " + name);
  ,
  department(dev) 
    ...
  ,
  sessionFn(context) 
    const exp = context.$store.state.session.exp;
    let userSystemTime = new Date();
        userSystemTime = moment.utc(userSystemTime)

    const diff = moment(userSystemTime).diff(moment(exp), 'minutes');
    if (diff = 1) 
      // open modal
    
  

用法

这就是我在主应用程序中使用包的方式

import moment from 'moment';
import  sessionFn  from "hello-stratech";

export default 
  ...
  watch: 
    $route(to) 
      sessionFn(this, to.path, moment);
    
  
  ...

【问题讨论】:

【参考方案1】:

尝试通过npm i moment --save-devmoment 设为devDependancy,而不是依赖。

只有在开发包时(即开发项目时)才需要这种时刻,而在使用时则不需要。

希望它能解决您的问题

for more depth knowledge

【讨论】:

【参考方案2】:

您不需要将 moment 导入函数并将其传递到函数中,因为您将它导入到函数文件中。您甚至没有在函数中使用传递的参数。所以你可以安全地不要通过它。你也没有使用你传递to.path的第二个参数,所以你也可以省略它。

作为一个建议,你应该安装和使用 eslint,它会捕捉到这样的东西。例如,您可以使用 create nuxt app 使用 eslint 设置 nuxt 项目。

esm 3.21-3.22 中还有一个错误会阻止 commonjs 和 es6 导入一起工作 https://github.com/standard-things/esm/issues/773 。这应该在新的 esm 发布时修复

【讨论】:

to,path 被使用。使用它的代码部分与问题无关,因此它不在代码 sn-p 您不需要将 moment 导入函数并将其传递到函数中,因为您是在函数文件中导入它 - 就像我说的,当我使用 sessionFn(this, to.path) 时,moment 是未定义的,我必须在调用该函数时传递它sessionFn(this, to.path, moment); 以便获取时刻 @SimoD'loMafuxwana 您正在混合 cjs 和 es6 导入,esm 中存在破坏这种用法的错误,我想这是您的情况。将 module.exports 更改为 es6 并尝试 就是这样。我将导入更改为 const moment = require("moment"); 并且它有效。谢谢 @SimoD'loMafuxwana 我已经参考那个 esm 错误更新了答案:)

以上是关于如何使用 npm 包依赖的主要内容,如果未能解决你的问题,请参考以下文章

对于内部依赖特定版本的不同包,如何管理项目中多个版本的 npm 模块?

如何在忽略 semver 的情况下安装 NPM 包?

如何确定旧 npm 包版本的依赖关系

如何使用“yarn”或“npm”列出特定类型的依赖项

如何使用 npm 重新安装应用程序的依赖项?

npm 如何通过 package.json 安装依赖最新版