为浏览器编译javascript的网页包

为浏览器编译javascript的网页包,javascript,node.js,webpack,Javascript,Node.js,Webpack,谢谢你的关注! 我已经用webpack从我的源代码中构建了一个javascript文件,我本打算在brower中使用它,但它似乎对我不起作用,所以我将此发布以寻求帮助 这是我的项目树 project ├── dist │   └── my-dist.js ├── index.js ├── lib │   └── my-source.js └── webpack.config.js 这是my-source.js 'use strict' const somepackage = require(

谢谢你的关注! 我已经用webpack从我的源代码中构建了一个javascript文件,我本打算在brower中使用它,但它似乎对我不起作用,所以我将此发布以寻求帮助 这是我的项目树

project
├── dist
│   └── my-dist.js
├── index.js
├── lib
│   └── my-source.js
└── webpack.config.js
这是my-source.js

'use strict'

const somepackage = require("somepackage")

module.exports = MyPkg

function MyPkg(param) {
    this.myprop = param
}

MyPkg.prototype.Afunc = function () {
    consolg.log("hello from A ", this.myprop)
}

MyPkg.prototype.Bfunc = function (param) {
    // B do some thing
}
这是我的index.js

exports = module.exports = require('./lib/MyPkg');
这是我的webpack.config.js

const path = require('path')
module.exports = {
    entry: './index.js',
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: 'my-dist.js'
    },
    module: {
        rules: [{
            test: /\.js$/,
            exclude: /(node_modules|bower_components)/,
            use: {
                loader: 'babel-loader',
                options: {
                    presets: ['babel-preset-env']
                }
            }
        }]
    }
}
然后我运行“webpack”来构建文件,看起来还可以,并且创建了“my-dist.js”文件,所以我尝试这样使用它:

<html>
<head>
</head>
<body>
    <div>
        <button onclick="func()">click here</button>
    </div>
</body>
<script src="dist/my-dist.js"></script>
<script>
    var pkg = new MyPkg('haha')
    function func() {
        pkg.Afunc()
    }
</script>
</html>

点击这里
var pkg=new MyPkg('haha')
函数func(){
pkg.Afunc()
}
但它会抛出类似“未捕获引用错误:MyPkg未定义”的错误,我真的不知道如何修复它,请帮我一把,谢谢大家~

编辑x2: 以下是GitHub回购协议,并提供了进一步解释:


如果我没记错的话,我过去就有过这个问题。从您的输入文件中对JavaScript进行网页打包,以便没有其他文件或代码可以直接访问它

因此,在index.html中,此将不起作用

<script>
    var pkg = new MyPkg('haha')
    function func() {
        pkg.Afunc()
    }
</script>
注: 我们添加了“DOMContentLoaded”事件,以便在进行任何操作之前等待DOM加载。如果不这样做,可能会导致未定义按钮,因为浏览器引擎可能无法解析或呈现该按钮

编辑:下面是更详细的方法

假设您具有以下结构:

----index.html
----index.js
----Email/
---------email.js
----Validator/
---------validator.js
而index.js是您的主条目文件(Webpack在其中加载JavaScript)

Email.js内容:

// Ficticious/non-existent npm package
import email from 'send-email'
// Custom and ficticious email class that will send emails
export class Email {
   sendEmail(subject, message) { 
       // You would send the email somehow.
       email.send('contact@support.com' this.subject, message); 
   }
}
// Checks if the value is undefined or null
module.exports = function (value) {
    return !!value
}
Validator.js内容:

// Ficticious/non-existent npm package
import email from 'send-email'
// Custom and ficticious email class that will send emails
export class Email {
   sendEmail(subject, message) { 
       // You would send the email somehow.
       email.send('contact@support.com' this.subject, message); 
   }
}
// Checks if the value is undefined or null
module.exports = function (value) {
    return !!value
}
在index.html中:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <input type="name" id="js-name" placeholder="message" />
    <textarea id="js-msg" placeholder="Write us a message"></textarea>
    <button id="js-send">Send us a message!!</button>
    <!-- Awful Real-life example -->
    <button id="js-validate">Validate Text!</button>
    <script src="index.js"></script>
</body>
</html>

文件
给我们发个信息!!
验证文本!
在index.js(网页包的主文件)中:

//我们导入要使用的电子邮件类
从“./Email/Email.js”导入{Email}
//我们还添加了验证器
从“./validator/validator.js”导入验证程序
/**
*现在是真正的魔法。Webpack定义变量和函数名的范围,更改
*正常值,以避免与其他函数和变量发生冲突(我可能有错)。
* 
*尽管如此,JavaScript允许我们通过事件监听器以编程方式将这些函数附加到元素。
* https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener
*这意味着onclick()事件是相同的

*as element.addEventListener('click',func);其中元素是ok,只需将其保存在记录中即可。 我想出了一个特别的方法,这里看起来像:

project
├── dist
│   └── my-dist.js
├── src
│   └── my-entry-build.js
├── index.js
├── lib
│   └── my-source.js
└── webpack.config.js
项目树现在如下所示:

project
├── dist
│   └── my-dist.js
├── src
│   └── my-entry-build.js
├── index.js
├── lib
│   └── my-source.js
└── webpack.config.js
我更新了“webpack.config.js”和“my entry build.js”,其他人保持静止

新的“webpack.config.js”如下所示:

新的“my entry build.js”如下所示:

const MyPkg = require('../index.js')
window.MyPkg = MyPkg

一切都完成了

但是。。。这是Node.js。这是一个服务器端环境。您正在尝试在浏览器中运行节点代码吗?我遗漏了什么?如果我没记错的话,webpack将函数的作用域排除在全局作用域之外。在英语中,这意味着您不能通过my-dist.js之外的正常方式访问函数。建议将您需要的所有代码都放在该文件中。如果您需要进一步解释,请告诉我。@JoseA是的,如果我想让这项工作顺利进行,我应该如何更改我的帐户code@JeremyThille实际上它在vue.js中工作,vue.js不是浏览器应用程序吗?是的,但你没有提到Vuethanks对我的帮助,但它对我仍然不起作用,以下是我在代码中所做的,请查看\n文档。addEventListener('DOMContentLoaded',function(){document.getElementById('js-pkg')。addEventListener(MyPkg);};函数func(){var pkg=new MyPkg('haha')pkg.Afunc()}这是另一个函数,尽管我建议不要污染窗口对象(因为这是Webpack要防止的),但请确保不要覆盖window.MyPkg或在全局级别(在任何函数之外)定义var MyPkg,因为它将被覆盖!!!(您的解决方案有点类似于jQuery之类的库所做的工作……如果项目进展顺利,请小心!!)@JoseA谢谢!我对如何通过“DOMContentLoaded”的方式使用它很感兴趣,请您详细介绍一下好吗?当然可以!检查我的原始答复!!如果您需要进一步澄清,请告诉我@JoseA我试过了,但它对我不起作用,所以是的,我需要进一步澄清我不会放弃!我也遇到过同样的情况!这里有一个repo-Check/src/index.js,我已经记录了代码,所以您可以查看它!!
const MyPkg = require('../index.js')
window.MyPkg = MyPkg