【问题标题】:Browserify with twitter bootstrapBrowserify 与 twitter 引导程序
【发布时间】:2014-09-09 18:23:44
【问题描述】:

这里有很多类似的问题,包括堆栈溢出的答案,但没有一个对我有用,所以我在这里问你们。感谢大家的时间。

我最近开始使用带有 browserify 的 gulp,效果很好。 然后我尝试在前端使用 browserify:Backbone 和 Bootstrap3。

在我尝试需要 Bootstrap 附带的 js 文件之前,一切似乎都可以正常工作。我在我的 chrome 工具中收到一条错误消息:jQuery 未定义。

我尝试过填充它,但我对填充物感到非常困惑。我正在使用 jQuery 2.1.1,所以我不需要填充 jQuery,但它现在存在于 shim 中,因为我绝望并尝试了一切。这是我的 package.json 和 main.js 文件:

-------------package.json------

{
  "name": "gulp-backbone",
  "version": "0.0.0",
  "description": "Gulp Backbone Bootstrap",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Rob Luton",
  "license": "ISC",


  "devDependencies": {
    "jquery": "^2.1.1",
    "backbone": "^1.1.2",
    "browserify": "^4.2.1",
    "gulp": "^3.8.6",
    "vinyl-source-stream": "^0.1.1",
    "gulp-sass": "^0.7.2",
    "gulp-connect": "^2.0.6",
    "bootstrap-sass": "^3.2.0",
    "browserify-shim": "^3.6.0"
  },

  "browser": {
    "bootstrap": "./node_modules/bootstrap-sass/assets/javascripts/bootstrap.js",
    "jQuery": "./node_modules/jquery/dist/jquery.min.js"
  },

  "browserify": {
    "transform": ["browserify-shim"]
  },

  "browserify-shim": {
    "jquery": "global:jQuery", 
    "bootstrap": {
      "depends": [
        "jQuery"
      ]
    }
  }
}

-------------------------- main.js ------------------- ---

var shim = require('browserify-shim');
$ = require('jquery');
var Backbone = require('backbone');
Backbone.$ = $;
var bootstrap = require('bootstrap');

/* the following logs fine if I comment out the bootstrap require, otherwise I get 'jQuery undefined' */

console.log(Backbone);
$(function() {
    alert('jquery works');
});

【问题讨论】:

标签: javascript twitter-bootstrap-3 browserify browserify-shim


【解决方案1】:

如果您使用 npm 安装了 jquery,则不需要以这种方式填充它。以下适用于我一直在编写的项目:

我还了解到,使用 npm 进行引导是一种 PITA。我一直在使用 bower 来安装和维护某些需要像这样填充的前端组件。

package.json:

{
  "name": "...",
  "version": "0.0.1",
  "description": "...",
  "repository": {
    "type": "git",
    "url": "..."
  },
  "browser": {
    "d3js": "./bower_components/d3/d3.min.js",
    "select2": "./bower_components/select2/select2.min.js",
    "nvd3js": "./bower_components/nvd3/nv.d3.min.js",
    "bootstrap": "./node_modules/bootstrap/dist/js/bootstrap.js"
  },
  "browserify": {
    "transform": [
      "browserify-shim",
      "hbsfy"
    ]
  },
  "browserify-shim": {
    "d3js": {
      "exports": "d3",
      "depends": [
        "jquery:$"
      ]
    },
    "bootstrap": {
      "depends": [
        "jquery:jQuery"
      ]
    },
    "select2": {
      "exports": null,
      "depends": [
        "jquery:$"
      ]
    },
    "nvd3js": {
      "exports": "nv",
      "depends": [
        "jquery:$",
        "d3js:d3"
      ]
    }
  },
  "devDependencies": {
    "browserify-shim": "~3.4.1",
    "browserify": "~3.36.0",
    "coffeeify": "~0.6.0",
    "connect": "~2.14.3",
    "gulp-changed": "~0.3.0",
    "gulp-imagemin": "~0.1.5",
    "gulp-notify": "~1.2.4",
    "gulp-open": "~0.2.8",
    "gulp": "~3.6.0",
    "hbsfy": "~1.3.2",
    "vinyl-source-stream": "~0.1.1",
    "gulp-less": "~1.2.3",
    "bower": "~1.3.3",
    "cssify": "~0.5.1",
    "gulp-awspublish": "0.0.16",
    "gulp-util": "~2.2.14",
    "gulp-rename": "~1.2.0",
    "gulp-s3": "git+ssh://git@github.com/nkostelnik/gulp-s3.git",
    "gulp-clean": "~0.2.4",
    "process": "~0.7.0"
  },
  "dependencies": {
    "backbone": "~1.1.2",
    "jquery": "~2.1.0",
    "lodash": "~2.4.1",
    "d3": "~3.4.8",
    "rickshaw": "~1.4.6",
    "datejs": "~1.0.0-beta",
    "moment": "~2.7.0"
  }
}

js:

$ = jQuery = require('jquery');
var _ = require('lodash');
var Rickshaw = require('rickshaw');
var d3 = require('d3js');
var nvd3 = require('nvd3js');
var moment = require('moment');
require('datejs');
require('select2');

var bootstrap = require('bootstrap');
console.log(bootstrap)

另外 - 有时有用的一件事是让 browserify-shim 输出其诊断信息。这就是我的 browserify.js 任务的样子:

var browserify   = require('browserify');
var gulp         = require('gulp');
var handleErrors = require('../util/handleErrors');
var source       = require('vinyl-source-stream');
var process      = require('process');

process.env.BROWSERIFYSHIM_DIAGNOSTICS=1;

var hbsfy = require('hbsfy').configure({
  extensions: ['html']
});

gulp.task('browserify', ['images', 'less'], function(){
    return browserify({
      transform: ['hbsfy', 'cssify'],
            entries: ['./src/javascript/app.js'],
        })
        .bundle({debug: true})
        .on('error', handleErrors)
        .pipe(source('app.js'))
        .pipe(gulp.dest('./build/'));
});

【讨论】:

  • 非常感谢您的回复。问题集中在 twitter bootstrap 上,这就是导致头痛的原因。正如我所提到的,我知道我不需要填充 jquery,我只是想尽一切办法让 bootstrap.js 与 browserify 一起工作,它依赖于 jQuery。 jQuery 在我的示例中实际上工作得很好,但是当我使用该行来要求 'bootstrap' 时,我在控制台中得到了 'jQuery' 未定义错误。所以我可能以错误的方式调整引导程序。我希望这很清楚。再次感谢您的回复。
  • 嘿@rob.luton,我已经更新了我的答案以包括引导程序。很抱歉之前没有更直接。希望对您有所帮助!
  • 谢谢!我还没有机会尝试,但这个例子正是我所需要的。
  • 很酷,它对我来说编译得很好,所以我希望它对你有用。
  • @urban_racoons 我发现使用 jquery:jQuery 对我有用,而 jquery:$ 抛出错误。Check this note,Im using evernote because my pastebin is still blocked,sorry for the code formatting 我使用 Bootstrap 3.3.1
【解决方案2】:

我使用 browserify 时出现错误,需要定义变量 '$' 或 'jQuery'。

添加窗口以使其全局解决错误。不确定这是否是正确的方法,如果不是,请告诉我。

window.$ = window.jQuery = require('jquery');
var bootstrapjs = require('bootstrap-sass');

【讨论】:

  • 这应该是完美的答案!仅当使用 jquery npm 依赖而不是 bower 时。无需添加垫片 :)
  • 它可以工作,但仍然感觉有点 hacky...Browserify 的重点不是避免这些事情吗?
  • @art-solopov 它是 hacky 但它是这个或重新创作一个 3rd 方库以使其成为 commonjs-able。
  • 这一行更改为我解决了问题。
【解决方案3】:

我一直在想这个问题。这个简单的解决方案为我完成了这项工作:

import foo from 'foo';
import bar from './bar';
import { default as $ } from "jquery";
global.$ = $;
global.jQuery = $; // This one does the trick for bootstrap!
// Boostrap's jQuery dependency only works with require, not with ES6 import!
const btp = require('bootstrap');

【讨论】:

  • 现在,如何在不直接将其添加到 html 文件中的情况下,以类似的方式包含引导 css 依赖项?
【解决方案4】:

所以要使Bootstrap 与Browserify 一起工作,您将需要Browserify CSS transforms 之一。

首先是 index.js(browserify 条目)

// Bootstrap needs jQuery on the Window
window.jQuery = $  = require('jquery');
// include popper.js if you want Bootstrap tooltips
window.Popper = require('popper.js');
// include bootstrap js libs (not the CSS libs as yet)
require('bootstrap');
// then the CSS Lib
require('bootstrap/dist/css/bootstrap.css');

NPM 安装:

npm install bootstrap@4.0.0-alpha.6 jquery popper.js

全局使用工具提示:

根据引导程序docs。

$('[data-toggle="popover"]').popover();

我有一个 Browserify-Budo repo here。如果你想看到它工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    相关资源
    最近更新 更多