如何在gulp中使用browserify时向浏览器公开"require"?

aso*_*erg 8 javascript node.js browserify gulp

当我有一个看起来像这样的文件x.js:

x.js

module.exports = function (n) { return n * 111 }
Run Code Online (Sandbox Code Playgroud)

我从命令行运行browserify,如下所示:

browserify -r ./x.js > bundle.js
Run Code Online (Sandbox Code Playgroud)

我得到一个看起来像这样的输出文件(粗略地):

require=(function e(t,n,r){function ......
./App.jsx":[function(require,module,exports){
module.exports=require('0+DPR/');
},{}]},{},[])
Run Code Online (Sandbox Code Playgroud)

然后在我的浏览器代码中我可以这样做:

<html>
  <head>
    <title>React server rendering example</title>
    <script src="static/bundle.js"></script>
  </head>
  <body>
    Welcome to the React server rendering example. Here is a server-rendered React component:
    <div id="53a442ff8b39d"></div><script>
    var x = require('./x.js');
    console.log(x(3))
</script>  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

我实际上有两个问题:

1)这在浏览器中不起作用我收到错误:"未捕获错误:找不到模块'./x.js'".为什么会这样?

2)我实际上想要使用vinyl-source-stream在gulp中运行它.我已经尝试在我的gulpfile中做这样的事情,但它不起作用.有任何想法吗?我收到错误'require is not defined'

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

var b = browserify({
    entries: ['./x.js'],
  });
   b.bundle({debug: false})
   .pipe(source('bundle.js'))
   .pipe(gulp.dest('./build'));
Run Code Online (Sandbox Code Playgroud)

mik*_*der 7

更新:您可以在-r开关中引用别名

尝试: browserify -r ./x.js:my-module > bundle.js

在您的页面中: var x = require('my-module');

注意:如果在节点模块上使用-r开关(如fsthrough),则不需要别名,因为它们的package.json文件中通常有一个名称.

有关详细信息,请参阅node-browserify - external要求.


如果你要捆绑你的x.js(使用-r开关),有几个选项

1)在你的html页面中获取脚本并单独捆绑.

      创建一个main.js文件并将其放入其中.

      使用 browserify -x ./x.js > main.js

      通过使用-x开关,Browserify将链接您的bundle.js作为依赖.

      然后引用页面中的两个JS文件.

2)使用Browserify生成的名称.

      var x = require('0+DPR/');

      请参阅上面的更新以创建别名.

以下是很好的资源,因为您希望与Gulp进一步合作

有关更多Gulp + Browserify(使用Watchify以及livereload)查看Viget上的博客文章