Javascript 是否可能包含取决于用户是否安装了特定软件包的功能(可选功能)
我正在编写一个模块,如果用户在其项目react intl中安装了该模块,我希望导出一个具有翻译功能的高级组件 这样我就不必维护两个版本的组件来避免安装警告 我一直在尝试使用OptionalDependenceny,但是当用户安装我的软件包时,它们被安装在用户的项目上 通常,这是我试图导入的源Javascript 是否可能包含取决于用户是否安装了特定软件包的功能(可选功能),javascript,node.js,reactjs,npm,ecmascript-6,Javascript,Node.js,Reactjs,Npm,Ecmascript 6,我正在编写一个模块,如果用户在其项目react intl中安装了该模块,我希望导出一个具有翻译功能的高级组件 这样我就不必维护两个版本的组件来避免安装警告 我一直在尝试使用OptionalDependenceny,但是当用户安装我的软件包时,它们被安装在用户的项目上 通常,这是我试图导入的源 /** * * ToggleOption * */ import React from 'react'; import PropTypes from 'prop-types'; import Option
/**
*
* ToggleOption
*
*/
import React from 'react';
import PropTypes from 'prop-types';
import Option from 'bootstrap-styled/lib/Option';
let injectIntl;
let intlShape;
// this make react-intl optional to our component and our module
try {
const reactIntl = require('react-intl'); // eslint-disable-line
injectIntl = reactIntl.injectIntl; // eslint-disable-line
intlShape = reactIntl.intlShape; // eslint-disable-line
} catch (er) {
injectIntl = null;
intlShape = null;
}
/**
* This component is automatically used when using `<Toggle />`
* If you need a different option tag, instead just pass the prop `optionTag` of `<Toggle />`.
*/
const ToggleOption = ({
tag: Tag,
value,
message,
intl,
}) => (
<Tag value={value}>
{message && intl ? intl.formatMessage(message) : value}
</Tag>
);
ToggleOption.defaultProps = {
tag: Option,
};
/* eslint-disable react/require-default-props */
ToggleOption.propTypes = {
/**
* Replace the default component tag by the one specified. Can be:
*/
tag: PropTypes.oneOfType([
PropTypes.string,
PropTypes.element,
PropTypes.func,
]),
/**
* The value
*/
value: PropTypes.string.isRequired,
/**
* react-intl messages (optional)
*/
message: PropTypes.object,
};
let exported = ToggleOption; // eslint-disable-line import/no-mutable-exports
if (intlShape) {
/** @ignore */
ToggleOption.propTypes.intl = intlShape.isRequired;
exported = injectIntl(ToggleOption);
}
export default exported;
是否有办法配置我的模块以实现此目的?您可以检查if typeof module是否已包含/需要模块!==未定义 如果您想包括/需要可能已安装的模块,另一个选项是 祝你好运 编辑:
至于使用,它不会更改您的代码-您仍然必须使用try/catch执行相同的检查。您可以检查if typeof module是否已包含/需要某个模块!==未定义 如果您想包括/需要可能已安装的模块,另一个选项是 祝你好运 编辑:
至于使用,它不会更改您的代码-您仍然必须使用try/catch执行相同的检查。包中的可选依赖项。json始终默认安装。要避免这些问题,您必须使用以下设备安装:
npm install [PACKAGE] --no-optional
例如,你可以在你的描述中注意到它,就像我一样:
PS:您的代码很好。您的package.json中的可选依赖项始终默认安装。要避免这些问题,您必须使用以下设备安装:
npm install [PACKAGE] --no-optional
例如,你可以在你的描述中注意到它,就像我一样:
PS:您的代码很好。我不确定他有什么问题,但我猜他是在问如何避免安装该软件包,因为它是可选的。附言:我没有投反对票。@JorgeFuentesGonzález-谢谢你的解释。我想我的答案并不适合OP的要求。。。但也许我真的不明白这个问题_ツ_/''此外,JavaScript没有用于已安装模块的名称空间。你需要事先要求他们。最接近的方法是检查全局变量,因为在浏览器中,注入库的典型非网页包方式是将它们添加到窗口中,因此您可以使用if window.Module或if typeof Module!==未定义,但如果模块。。。如果模块未定义,将抛出模块未定义错误。我本来打算回答try/catch问题,但看到了你的-1,所以我试图用其他方式理解这个问题xD有点不清楚。@JorgeFuentesGonzález-谢谢你的回答。我修复了丢失的字体。至于名称空间,我修正了这个问题,但我把它放在了括号里。我猜术语可能与C++或RIST不同,但是全局变量执行的函数定义了所有函数,因为该变量的成员可以防止冲突……我不确定他有什么问题,但我猜他是在询问如何避免安装包,因为它是可选的。附言:我没有投反对票。@JorgeFuentesGonzález-谢谢你的解释。我想我的答案并不适合OP的要求。。。但也许我真的不明白这个问题_ツ_/''此外,JavaScript没有用于已安装模块的名称空间。你需要事先要求他们。最接近的方法是检查全局变量,因为在浏览器中,注入库的典型非网页包方式是将它们添加到窗口中,因此您可以使用if window.Module或if typeof Module!==未定义,但如果模块。。。如果模块未定义,将抛出模块未定义错误。我本来打算回答try/catch问题,但看到了你的-1,所以我试图用其他方式理解这个问题xD有点不清楚。@JorgeFuentesGonzález-谢谢你的回答。我修复了丢失的字体。至于名称空间,我修正了这个问题,但我把它放在了括号里。我猜术语可能与C++或RIST不同,但是全局变量执行的函数与定义该函数的所有成员的函数几乎相同,可以防止碰撞。我猜我帮助过了6K标记。一开始我没注意到,但看起来很不错:-@Myst正是哈哈。我想我帮你通过了6K。一开始我没注意到,但看起来很不错:-@Myst正是哈哈。Thnx^^