编写npm模块如何自动解决nodejs和react都要引入使用的模块语法不兼容问题?

举个栗子,我想实现做一个npm模块,要像他这样

大家应该都知道axios这个模块 ,
在nodejs中它是这么引入的

const axios = require('axios')

在react中它是这么引入的

import axios from 'axios'

显然nodejs不支持es6的模块语法,那么我编写模块的时候如何暴露模块才能兼容node和react的模块语法呢?

我有一些idea

function Mypackage(){...}
try{
    export default Mypackage
}catch(err){
    modules.export = Mypackage
}

像这样应该也能行,但try catch毕竟是个耗性能的东西

我想知道大家通用的兼容办法是什么?

阅读 2.8k
3 个回答

就举axios这个例子,找到node_modules/axios/index.js应该能看到一行:

module.exports = require('./lib/axios');

此为node方式的导出,但其实在项目中用import方式一样可以导入,这说明了es6 import本身已经可以导入module.exports方式导出的模块。
所以其实这个兼容问题与编写的模块无关,即使编写时是export default方式导出的模块,可能在项目编译后都是转为module.exports方式,这取决于项目的模块化配置(webpack/babel)。
所以要解决你的问题你可能需要:

  • 分离这个模块(不要藕和进node或react项目的src中)
  • 单独编译这个模块为module.exports方式导出
  • 在两头都用各自语法引入编译后的这个模块
  • 考虑把这个模块发布到npm,也就是分离出这个项目

客户端和 node 端都用 import axios from 'axios' 导入。配置好 babel 就行了。

这种模板代码网上很多

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题