browser 字段
你可以在包中的 package.json 文件中定义一个 browser 字段, 这样可以让browserify将 main 字段覆盖掉, 或者覆盖其他单独的文件.
如果你有一个有着 main.js 入口的模块, 但是对于浏览器有特定版本的 browser.js ,你可以这样做:
{ "name": "mypkg", "version": "1.2.3", "main": "main.js", "browser": "browser.js"}
现在, 当别人在node端 reuqire('mypkg') 的时候, 他们会得到 main.js 的exports值, 当他们使用browserify的时候, 他们会得到 browser.js 的exports值.
将node端与browser端用这种方式去分开来, 比在代码运行时去检测是在node端还是browser端而去加载不同的模块要好. 如果node和browser的 require() 调用的是同一个文件, browserify的静态分析将会包含所有的被require的module, 不管是否会起到作用. 你可以使用object类型而不是字符串作为 browser 字段的值. 例如, 如果你想替换掉 lib/ 文件夹中的一个文件, 替换为浏览器版本的, 你可以这样做:
{ "name": "mypkg", "version": "1.2.3", "main": "main.js", "browser": { "lib/foo.js": "lib/browser-foo.js" }}
再或者, 你想替换掉你的包中require的其他包, 你可以这样做:
{ "name": "mypkg", "version": "1.2.3", "main": "main.js", "browser": { "fs": "level-fs-browser" }}
你可以忽略某些文件(设置他们的内容为空), 通过设置它们在browser字段中的值为 false:
{ "name": "mypkg", "version": "1.2.3", "main": "main.js", "browser": { "winston": false }}
设置的browser字段只作用域当前模块. 映射表不会向下作用于它的依赖包,或者向上作用雨依赖它的包. 这种孤立设计是为了防止模块之间的危害, 如此当你require一个模块的时候, 你不必担心它所带来的其他影响. 就像你不必担心你的本地配置会影响到在你的依赖树很深的模块.