Невозможно загрузить нодальные нодоны Node с помощью веб-пакета - PullRequest
0 голосов
/ 17 сентября 2018

Хотя я использую vue-cli в примере кода для создания конфигурации веб-пакета, ничего не характерно для vue.

Я создаю пример приложения, например, так:

vue init webpack webpack_modules_example

Сгенерировано webpack.base.conf:

'use strict'
const path = require('path')
const utils = require('./utils')
const config = require('../config')
const vueLoaderConfig = require('./vue-loader.conf')

function resolve (dir) {
  return path.join(__dirname, '..', dir)
}

module.exports = {
  context: path.resolve(__dirname, '../'),
  entry: {
    app: './src/main.js'
  },
  output: {
    path: config.build.assetsRoot,
    filename: '[name].js',
    publicPath: process.env.NODE_ENV === 'production'
      ? config.build.assetsPublicPath
      : config.dev.assetsPublicPath
  },
  resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      'ad-block': 'ad-block/build/Release/ad-block.node',
      '@': resolve('src'),
    }
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: vueLoaderConfig
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
      },
      {
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('img/[name].[hash:7].[ext]')
        }
      },
      {
        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('media/[name].[hash:7].[ext]')
        }
      },
      {
        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
        }
      },
    ]
  },
  node: {
    setImmediate: false,
    dgram: 'empty',
    fs: 'empty',
    net: 'empty',
    tls: 'empty',
    child_process: 'empty'
  }
}

Я хочу включить эту библиотеку , поэтому я делаю это:

npm install --save ad-block

И накод (App.vue) Я добавляю это:

<script>
...
  const {AdBlockClient, FilterOptions} = require('ad-block')
...

Поскольку это собственный модуль, мне нужно установить какой-либо загрузчик для веб-пакета (пробовал несколько):

npm install native-ext-loader --save-dev

Добавьте загрузчик в конфигурацию веб-пакета:

  {
    test: /\.node$/,
    loader: "native-ext-loader"
  },

И создайте псевдоним в конфигурации веб-пакета:

alias: {
      ...
      'ad-block': 'ad-block/build/Release/ad-block.node',
      ...
    }

Но когда я запускаю npm run dev и иду вhttp://localhost:8080/ Я вижу эту ошибку в консоли:

Uncaught Ошибка: невозможно открыть /ad-block.node: TypeError: Невозможно прочитать свойство 'dlopen' из неопределенного

в Object.eval (ad-block.node? 9538: 1)

в eval (ad-block.node: 2)

в Object ../ node_modules / ad-block /build / Release / ad-block.node (app.js: 733)

в webpack_require (app.js: 679)

в fn (app.js:89)

в eval (App.vue? 26cd: 9)

в Object ../ node_modules / babel-loader / lib / index.js! ./ node_modules / vue-loader / lib / selector.js? type = script & index = 0! ./src / App.vue (app.js: 757)

в webpack_require (app.js: 679)

в fn (app.js: 89)

в eval (App.vue? A8e9: 1)

Если я использую это без веб-пакета, это работает.Не уверен, что мне не хватает!

1 Ответ

0 голосов
/ 18 сентября 2018

NodeJS является средой программирования на стороне сервера и поэтому поддерживает «родные» дополнительные модули, скомпилированные для запуска на том же хосте, на котором работает служба Node.

Хотя Node программируется с использованием JavaScript, онне является браузерным JavaScript, и поэтому нельзя ожидать, что нативные надстройки будут выполняться в браузере.

См. Узел C ++ Addons для получения дополнительной информации.

...