繁体   English   中英

使用 webpack 在浏览器中使用 require 模块

[英]Using webpack to use require modules in browser

过去 2 天尝试在带有 webpack 的浏览器中使用 require('modules') ,当时我可以在 5 分钟内在 browserify 中做同样的事情......

这是我的webpack.config.js

var webpack = require('webpack');
var path = require('path');
var fs = require('fs');

var nodeModules = {};
fs.readdirSync('node_modules')
  .filter(function(x) {
    return ['.bin'].indexOf(x) === -1;
  })
  .forEach(function(mod) {
    nodeModules[mod] = 'commonjs ' + mod;
  });

module.exports = {
    entry: "./main.js",
    output: {
        filename: "bundle.js"
    }
}

但是,无论我做什么,我都会遇到某种错误。 目前我得到:

bundle.js:390 Uncaught Error: Cannot find module "net"

当我运行 webpack 时,它会抛出这些错误: http ://pastebin.com/RgFN3uYm

我遵循了https://webpack.github.io/docs/tutorials/getting-started/http://www.pauleveritt.org/articles/pylyglot/webpack/但我仍然遇到这些错误。

我试图用这个来运行它: webpack ./main.js -o bundle.js但它仍然不起作用。

如何解决这个问题?

您应该添加目录来解决例如

 resolve: {
        modulesDirectories: ['./app/', './node_modules']
 }

更新:添加 json 加载器

npm install --save-dev json-loader

module: {
    loaders: [
      { test: /\.json$/, loader: 'json-loader' }
    ]
  }

fs、net、tls 也是 node.js 的库,不用于浏览器内使用。 你应该添加:

node: {
    fs: 'empty',
    net: 'empty',
    tls: 'empty'
  }

你的文件夹结构是什么?

你应该有:

packages.json
node_modules/net/
webpack.config.js
src/main.js

然后在 main.js 添加

var net = require('net');

在 webpack.config.js 上:

const path = require('path');

const PATHS = {
    src: path.join(__dirname, 'src'),
    dist: path.join(__dirname, 'dist')
};

module.exports = {
    entry: path.join(PATHS.src, 'main.js'),
    output: {
        path: PATHS.dist,
        filename: 'bundle.js'
    }
}

运行webpack ,这很重要,在 index.html 上,指向包文件,而不是 main.js!

节点模块不能从浏览器运行。

可悲的是,就是这么简单。 让我们退后一步。 来自官方网站

Node.js® 是基于 Chrome 的 V8 JavaScript 引擎构建的 JavaScript 运行时。

它可能看起来像是一个细节,但它本身并不意味着浏览器中的 JavaScript 运行时。 然而,作为一个 JavaScript 运行时,它可以解释和运行 javascript 代码,增加了与我们在浏览器中可以做的不同的功能,例如require()函数。 它是在 Node 中构建的,但不是在 V8 中构建的。

节点还允许编写模块。 您可以用 C++ 编写一个节点模块,编译它并在 Node 上下文中导入它。 这是一个令人难以置信的优势,因为它允许 javascript 访问较低级别的功能,这反过来又允许使用 javascript 编写服务器。

低级功能在浏览器中不可用。

让我们考虑一下:

const fs = require('fs');

如果在浏览器中运行,它甚至应该是什么意思? 什么文件系统? 我敢说,在任何情况下,我都不应该想要我咨询的任何随机网站来访问它运行的机器的文件系统。 在服务器的情况下,在 Node 环境中,访问文件系统是必要的。

节点模块,例如 fs、tls 或 net,使用在浏览器中没有等效项的低级功能,无论是逻辑(“什么文件系统?”)还是安全性(“不,您的 javascript 代码不应该能够创建原始 tcp 连接”)原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM