node.js - nodejs - 无法使用导入包中的模块

标签 node.js npm webpack babeljs

我创建了一个 npm 包 https://www.npmjs.com/package/vue-top-down-test ,它只导出两个对象 VueTopDownVueTopDownItem

import { VueTopDown } from './vue-top-down'
import { VueTopDownItem } from './vue-top-down-item'

module.exports = {
  VueTopDown,
  VueTopDownItem
}

但是,我未能在我的演示中使用(甚至只是打印)它们 https://github.com/MoYummy/vue-top-down/tree/master/docs/demo-node .

import * as VTD from 'vue-top-down-test'
import Vue from 'vue'

console.log(Vue)
console.log(VTD)

有人能给我一些线索吗?谢谢。

最佳答案

webpack.config.js 中将 output.libraryTarget 设置为 umd。默认 libraryTarget 设置为 var。返回值被分配给一个变量,它不能在模块内部使用

  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].js',
    library: 'VueTopDown',
    libraryTarget: 'umd',
    umdNamedDefine: true
  }

多个目标 尽管 webpack 不支持将多个字符串传递到目标属性中,但您可以通过捆绑两个单独的配置来创建同构库:Multiple Targets

const path = require('path');
const serverConfig = {
  target: 'node',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'lib.node.js'
  }
  //…
};

const clientConfig = {
  target: 'web', // <=== can be omitted as default is 'web'
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'lib.js'
  }
  //…
};

module.exports = [ serverConfig, clientConfig ];

修改了webpack.config.js供您引用

const path = require('path');
const webpack = require('webpack');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');

const serverConfig = {
  mode: 'production',
  target: 'node',
  entry: {
    'vue-top-down': './src/index.js',
    'vue-top-down.min': './src/index.js'
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].js',
    library: 'VueTopDown',
    libraryTarget: 'umd'
  },
  module: {
    rules: [{
      test: /\.js$/,
      loader: 'babel-loader',
      query: {
        presets: ['env']
      }
    }]
  },
  stats: {
    colors: true
  },
  devtool: 'source-map',
  optimization: {
    minimizer: [
      new UglifyJsPlugin({
        test: /\.min\.js$/
      })
    ]
  },
  plugins: [
    new CleanWebpackPlugin([
      path.resolve(__dirname, 'dist')
    ]),
  ]
};

const clientConfig = {
  mode: 'production',
  target: 'web',
  entry: {
    'vue-top-down': './src/index.js',
    'vue-top-down.min': './src/index.js'
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].web.js',
    library: 'VueTopDown'
  },
  module: {
    rules: [{
      test: /\.js$/,
      loader: 'babel-loader',
      query: {
        presets: ['env']
      }
    }]
  },
  stats: {
    colors: true
  },
  devtool: 'source-map',
  optimization: {
    minimizer: [
      new UglifyJsPlugin({
        test: /\.min\.js$/
      })
    ]
  },
  plugins: [
    new CleanWebpackPlugin([
      path.resolve(__dirname, 'dist')
    ]),
  ]
};

module.exports = [serverConfig, clientConfig];

关于node.js - nodejs - 无法使用导入包中的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50795593/

相关文章:

node.js - res.send() 给出 HTML 代码而不是渲染它

javascript - 如何将基于 IIFE 的 JavaScript 模块导入 Angular TypeScript 应用程序?

javascript - 有条件导入 npm 模块?

javascript - 如何使用 requirejs 导入 strophe?

node.js - 了解 Node JS/Node Inspector V8 协议(protocol)

node.js - X-Content-Encoding-Over-Network 位于响应 header 中,但不位于 Content-Encoding 中

node.js - Heroku -dyno停止运行/ sleep ,哪里添加 'var port = process.env.PORT || 3000'

node.js - GitHub Action 构建 firebase 应用程序失败 w9jds/firebase-action

javascript - 为什么webpack找不到loader

node.js - Node 包管理器 (NPM) 似乎产生了重复的包