很难让browserify-shim使用grunt-browserify(> 2.0.2)作为转换

J. *_*rsh 11 javascript commonjs node.js browserify gruntjs

在版本2.0.2中grunt-browserify,browserify-shim已从模块本身中删除并转换为用作a transform,而不是直接option执行grunt-browserify任务.

使用垫片的版本grunt-browserify看起来如此:

'libs-dev': {
    src: [path.join('<%= config.dirs.browserLibs %>', 'angular', 'angular.js')],
    dest: path.join('<%= config.dirs.dest.dev %>', 'js', 'libs.js'),
    options: {
        shim: {
            angular: {
                path: path.join('<%= config.dirs.browserLibs %>', 'angular', 'angular.js'),
                exports: 'angular'
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这很好用,并在libs.js模块周围生成一个包装器:

require=(function(e,t,n){function i(n,s){if(!t[n]){if(!e[n]){var o=typeof require=="function"&&require;if(!s&&o)return o(n,!0);if(r)return r(n,!0);throw new Error("Cannot find module '"+n+"'")}var u=t[n]={exports:{}};e[n][0].call(u.exports,function(t){var r=e[n][1][t];return i(r?r:t)},u,u.exports)}return t[n].exports}var r=typeof require=="function"&&require;for(var s=0;s<n.length;s++)i(n[s]);return i})({"angular":[function(require,module,exports){
    module.exports=require('i10PRm');
},{}],"i10PRm":[function(require,module,exports){
    (function(global){(function browserifyShim(module, exports, define, browserify_shim__define__module__export__) {
        browserify_shim__define__module__export__(typeof angular != "undefined" ? angular : window.angular);
    }).call(global, undefined, undefined, undefined, function defineExport(ex) { module.exports = ex; });
})(window)
},{}]},{},["i10PRm"]);
Run Code Online (Sandbox Code Playgroud)

但是,基于(令人难以置信的稀疏和令人沮丧的)文档,内部垫片的版本grunt-browserify被用作transform,如下:

'libs-dev': {
    src: [path.join('<%= config.dirs.browserLibs %>', 'angular', 'angular.js')],
    dest: path.join('<%= config.dirs.dest.dev %>', 'js', 'libs.js'),
    options: {
        transform: ['browserify-shim']
    }
}
Run Code Online (Sandbox Code Playgroud)

而且,由于browserify-shim现在的配置完全基于package.json配置,我的package.json外观如下:

"browser": {
    "angular": "./bower_components/angular/angular.js"
},
"browserify-shim": {
    "angular": "angular"
}
Run Code Online (Sandbox Code Playgroud)

但是,这会生成一个看起来像这样的包装器:

(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
    (function (global){
        __browserify_shim_require__=require;(function browserifyShim(module, exports, require, define, browserify_shim__define__module__export__) {
            browserify_shim__define__module__export__(typeof angular != "undefined" ? angular : window.angular);
    }).call(global, undefined, undefined, undefined, undefined, function defineExport(ex) { module.exports = ex; });
}).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{}]},{},[1]);
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这个新包装器中缺少某些东西; 似乎没有相当于i10PRm旧包装器中分配的导出值.据推测,这意味着我正在以某种方式错误地使用导出,尽管我正在关注browserify-shim文档,但这一切看起来都相当简单.

非常喜欢grunt-browserify(>= 2.0.2)的最新版本browserify-shim以及如何正确使用它们的任何帮助或清晰度.

J. *_*rsh 16

为后人的缘故只是一个更新:我最终抛弃grunt-browserify,只是使用browserify-shimbrowserify在命令行.它立即工作,没有任何问题.

我相信三个库(browserify,grunt-browserifybrowserify-shim)的组合都只是简单地更新和更改太快,以至于无法在它们更新时依赖它们一起工作.放弃grunt组件使剩下的两个更容易管理.

browserify-shim的创建者似乎同意:

...根据我的经验,当人们在任务运行器中包装browserify和browserify-shim(两者都在package.json中完全可配置)时,他们的生活会变得更加艰难.

  • 提升相关性.我发誓,JS工具现在就像狂野的西部.每个人都在向前推进,在营地之间形成了竞争,鬼城已经存在,人们被抛在后面,没有人会停下来直到他们到达海岸,然后就没有其他地方可去了. (38认同)

bas*_*ten 10

我也在努力解决这个问题,但是我设法通过完全删除我的垫片设置Gruntfile.js并让browserify它们处理它来实现它package.json.在这里我使用垫片jquery,你也可以看到我在下面运行的版本:

// portion of package.json

"browser": {
    "jquery": "./js/lib/jquery-1.11.0.min.js"
},
"browserify-shim": {
    "jquery": "$"
},
"browserify": {
    "transform": [
        "browserify-shim"
    ]
},
"devDependencies": {
    "grunt": "~0.4.1",
    "grunt-cli": "~0.1.10",
    "browserify": "~3.44.2",
    "browserify-shim": "~3.4.1",
    "grunt-browserify": "~2.0.8"
}
Run Code Online (Sandbox Code Playgroud)

Gruntfile.js现在的相关部分看起来像这样:

// portion of Gruntfile.js

browserify: {
    bundleOptions: {
        debug: true
    },
    src: 'js/src/main.js',
    dest: 'js/output.js'
},
Run Code Online (Sandbox Code Playgroud)

grunt:browserify现在按预期工作,通过调用browserify但允许它自己处理browserify-shim.