【问题标题】:How can I initialize a jQuery plugin (noUISlider) included via browserify-shim?如何初始化通过 browserify-shim 包含的 jQuery 插件(noUISlider)?
【发布时间】:2014-11-17 02:49:39
【问题描述】:

你好,Overfluvians!

我正在开发一个瑞士军队构建系统(GulpBrowserifyBowerBrowserSyncRunSequenceNodemonjQuery),但试图获得一个 jQuery插件填充到构建中,DOM 让我很难过。

如果您想自己快速重现该问题,我已经整理了一个沙盒存储库:gulp-browserify-bower-test。如果您是一个在脑海中构建应用程序的勇敢者,请继续。

我要解决的问题是:我如何正确地填充或要求 jQuery 以便在分布式构建中满足依赖关系而不会出现不必要的膨胀? p>

以下是相关文件及其相关内容:

1。用于初始化滑块的预浏览客户端脚本bundle.js

var $ = require('jquery')

var maskedinput = require('maskedinput')

function maskInputs() {
  return $('input#zip').mask('99999')
}
maskInputs()

var nouislider = require('nouislider')

function initSlider() {
  return $('div#slider').noUISlider()
}

initSlider()

2。包含要初始化的滑块元素的页面index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>NoUISlider Gulp Demo</title>
</head>
<body>

    <div id="nouislider"></div>
    <input type="tel" id="zip">
    <script src="/dist/js/all.js"></script>
</body>
</html>

3。 bower.json 引入了 jQuery 和 jQuery 插件

"dependencies": {
  "jquery": "~2.1.1", // not sure if need jquery via bower or not
  "jquery.maskedinput": "~1.3.1",
  "nouislider": "~7.0.7"
}

4。 package.json 将模块巫术化为 browserify 垫片,设置它们的导出名称和依赖关系:

"browserify": {
  "transform": [
    "browserify-shim"
  ]
},
"browser": {
  "jquery": "./node_modules/jquery/dist/jquery.js",
  "maskedinput": "./bower_components/jquery.maskedinput/jquery.maskedinput.min.js",
  "nouislider": "./bower_components/nouislider/distribute/jquery.nouislider.all.min.js"
},
"browserify-shim": {
  "jquery": "global:jQuery",
  "maskedinput": {
    "exports": "maskedinput",
    "depends": [ "jquery:$" ]
  },
  "nouislider": {
    "exports": "nouislider",
    "depends": [ "jquery:$" ]
  }
},
"dependencies": {
  "jquery": "~2.1.1"
},
"devDependencies": {
  "browserify": "^5.11.0",
  "browserify-shim": "^3.6.0",
  "gulp": "^3.7.0",
  "vinyl-source-stream": "^1.0.0"
}

我也尝试过使用 jquery 的 bower 版本,将其替换为 package.json 中的 npm 版本:

==== try this ====
"jquery": "./bower_components/jquery/lib/jquery.js",
==== or this ====
"jquery": "./node_modules/jquery/dist/jquery.js",

5。 gulpfile.js 包含 browserify gulp 任务:

var gulp = require('gulp')
var browserify = require('browserify')
var stream = require('vinyl-source-stream')

gulp.task('browserify', function(){
  return browserify('bundle.js')
        .bundle()
        .pipe(stream('all.js'))
        .pipe(gulp.dest('./'))
})

gulp.task('default', ['browserify'])

障碍

请注意,我可以在我的客户端 js 中使用 require('maskedinput'),但是当我尝试使用 require('nouislider') 时,我看到一个控制台错误,似乎说 NoUISlider 没有找到它的 jQuery 依赖项:"Uncaught TypeError: Cannot read property 'fn' of undefined" when正在尝试初始化 NoUISlider。

再一次,为了方便重现问题,这里设置了沙盒:gulp-browserify-bower-test

什么给了?我应该如何包含 jQuery 和这些插件?

有没有更好的方法来使用bowerBrowserify 但不能同时使用两者?我发现在 npmbower 上托管的几个模块的构建、模块类型和一般质量往往会有所不同,所以我认为同时容纳这两个包管理器是明智的。

【问题讨论】:

  • 我可以通过 Grunt 告诉你我是怎么做的吗?
  • 你试过不填充 jquery 吗?如果通过 npm 安装,则 package.json 的 browser 部分中不需要 shim 或别名。
  • $ = require('jquery') 是否意味着 jQuery 不能作为 window.jQuery 使用?
  • window.jQuery = $ = require('jquery') 将确保得到你想要的
  • @IanLim 很高兴看到您如何使用 Grunt 做到这一点。我会尝试将 jQuery 附加到 window,尽管我认为 browserify-shim 已经在全局命名空间中提供了它(来自 package.json):"browserify-shim": { "jquery": "global:jQuery"

标签: jquery bower gulp browserify nouislider


【解决方案1】:

noUiSlider 扩展了 window.jQuery 或 window.Zepto。由于这些都不可用,因此扩展原型 (fn) 将不起作用。只需添加:

var jQuery = $;

应该这样做。

【讨论】:

  • 好吧,我闻到了气味,但还没有找到尸体。它与你很棒的滑块库没什么关系,只是碰巧是我想使用的那个:) 我尝试将该行添加到编译到 DOM 的脚本中,但 Browserify 仍然抱怨没有定义 jQuery。
  • 我已经查看了您的代码:变量范围有几个问题。例如:var jQuery 在一个函数中定义,但在另一个函数中使用。您应该首先确保您在 global 上正确地确定了变量 + 属性的范围。
  • 感谢您对此进行调查!我今天通过将 browserify-shims 中 jQuery 的变量名从“$”更改为“jQuery”,让事情变得正常。然后我删除了 jQuery 的 shim,它显然没有像我想象的那样在全局命名空间中使用。查看package.json 了解我的意思。
  • 如果你想更新你的答案以确保 jquery 在垫片中被命名为“jQuery”以便插件识别它,我会虚心接受。
猜你喜欢
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
相关资源
最近更新 更多