【问题标题】:Browserify and Vue: uncaught reference error: Vue is not definedBrowserify 和 Vue:未捕获的引用错误:未定义 Vue
【发布时间】:2015-06-14 01:52:52
【问题描述】:

这是我第一次涉足任何前端开发,除了基本的 jQuery 东西,我正在使用 Vue.js 以及其他一些带有 Browserify 的包。我的主要“app.js”如下所示:

window.$ = window.jQuery = require('jquery');
require('bootstrap');
var moment = require('moment');
var fullCalendar = require('./vendor/fullcalendar.min.js');
var datetimepicker = require('./vendor/bootstrap-datetimepicker.min.js');
var select2 = require('./vendor/select2.min.js');
var VueResource = require('vue-resource');
var Vue = require('vue');
require('./videos/show.js');
require('./home.js');
require('./search.js');

Vue.use(VueResource);

new Vue({
    el: '#search',

    data: {
        message: 'Hello World!'
    },

});

...

它以这种方式按预期工作,但是当我尝试在另一个文件中(例如在 search.js 中)创建一个新的 Vue 实例时,我做不到。我在控制台中收到“未捕获的引用错误:未定义 Vue”。在其他地方使用其他必需的包没有问题 - 虽然我不明白为什么我需要以我正在做的方式导入 jQuery ......如果我这样做它将无法工作:

var $, jQuery = require('jquery');

我确信这是我还不理解的非常基本和基本的东西,但任何帮助将不胜感激!

【问题讨论】:

  • 你是否像上面的文件一样将 Vue 导入到 search.js 中?使用 CommonJS,您不希望也不应该使用全局变量。您将需要每个文件中的每个依赖项。
  • 我还看到很多 require 调用,而没有将需要的东西分配给某些东西——我希望看到 var x = require('x')... 这表明你正在使用很多全局变量,这又是一种气味。如果是针对 jQuery 之类的东西,但针对您自己的模块,这是一回事,这表明该概念的某些部分没有意义。我建议在点击之前阅读更多指南。
  • 是的,我想我错过了基本概念。之前,我在登录页面上有一个脚本,该脚本将使用 jstimezonedetect 获取用户的时区并将其存储在一个隐藏的输入中,我将与用户的凭据一起发送到服务器。现在,如果我需要该脚本,则在每次页面加载时都会调用该函数,并且该脚本会尝试将其返回值分配给 $('#timezone') 元素。对我来说没有意义。我所有的 js 都对特定页面上的特定元素进行操作。你有什么建议可以阅读以加快速度吗?
  • Hrm... "The Secrets of the JavaScript Ninjas" 真的很好,但我不知道它是否对这个特定案例有那么大的帮助。你快到了!对于隐藏字段的问题——创建模块但不运行模块中的代码——模块可以返回一个函数,你需要像var addHiddenField = require('./something');这样需要它的模块,然后像@一样使用它987654326@只在您需要的地方!您的模块应该几乎总是返回一个值(即10)、一个函数或一个对象。然后你在需要它之后对模块做一些事情。

标签: javascript browserify


【解决方案1】:

您遇到的问题是使用模块的基础知识。一般来说,一个模块应该总是导出一些行为或属性,然后你需要那个模块并使用它。例如,假设我想在某些页面上的表单中添加隐藏。我会这样做:

AddSecretToken.js

module.exports = function(form) {
  // code here to add the hidden input to the passed in form
}

然后在我有需要秘密输入的表单的其他地方,我会需要它:

MyForm.js

var addSecretToken = require('./AddSecretToken');

...
// some code that makes a form
addSecretToken(myForm);
...

显然,在某些时候,您需要一些实际运行某些东西的代码,但那将是您的根模块或您需要根模块的页面。所以也许你在顶部有一个app.js,它需要它需要的东西,然后运行app()而不导出任何东西。这就说得通了。但大多数模块不应该这样做。

任何时候你需要一些行为,你应该做一个模块,然后在任何你需要行为的地方,你需要这个模块。每个模块都应该需要它所依赖的东西——它不应该依赖于任何全局(有时 jQuery 是一个例外)。

【讨论】:

  • 感谢您抽出宝贵时间帮助我!但是在您的示例中, MyForm.js 包含在哪里?我的 app.js 中是否需要它?是否也包含在表达式中:module.exports = function() { ... }
  • 是的,它会被包含在 app.js 中的某个地方或 app.js 需要的东西中(如果你认为 require 树从模块 app.js 开始,它可能在 require 树的下方。 js需要)。我建议学习一些 NodeJS 风格的代码,即使您不想将 NodeJS 用作服务器,因为它一遍又一遍地显示 CommonJS 模式。
  • 再次感谢!现在才开始深入研究节点。对于我当前在后端使用 Laravel(及其 Blade 模板系统)的项目,我认为这可能是一个很好的方法,因为我的大部分 js 代码都是特定于页面的:stackoverflow.com/questions/21805308/… .... 做你认为这是一个好方法吗?
猜你喜欢
  • 2022-11-10
  • 2020-02-02
  • 2018-05-17
  • 2023-01-12
  • 2023-01-23
  • 2020-06-21
  • 1970-01-01
  • 2013-10-27
  • 1970-01-01
相关资源
最近更新 更多