浏览包含package.json的文件夹时,Browserify会覆盖自己的配置

Browserify overrides its own configuration when browsing a folder that contains a package.json?

本文关键字:Browserify 覆盖 自己的 配置 package 包含 json 文件夹 浏览      更新时间:2023-09-26

我使用AngularJS创建了一个简单的JavaScript应用程序。

我使用npmBower来管理我的依赖项,使用Gulp自动化我的任务,我想使用<strong]CommonJS>的module.exports/require()将所有内容捆绑在一起:我决定使用2Browserify将所有内容打包。

如果你想看看的话,Github上有我的非常空干净项目。


为了能够使用require('angular'),我将Browserify配置为将AngularJS填充到可用模块中,使用Browserify填充程序。非常简单,以下是我的package.json:的相关部分

"browser": {
  "angular": "./bower_components/angular/angular.min.js"
},
"browserify": {
  "transform": [
    "browserify-shim"
  ]
},
"browserify-shim": {
  "angular": {
    "exports": "angular"
  }
}

它非常整洁,我的主JS文件现在看起来像这样:

'use strict';
var angular = require('angular');
angular.module('MyApp', [])
  .controller('View1Ctrl', ['$scope', require('./view1/view1.js')])
  .controller('View2Ctrl', ['$scope', require('./view2/view2.js')]);

这是有效的。


现在,我正在尝试使用通过Bower提供的外部库来了解一些更高级的内容。它们安装在bower_components下,看起来很好,就像我的项目一样,它们有一个package.jsonbower.json等等。

ng对话框为例,该对话框也是require('angular')。一旦通过bower install ng-dialog --save检索到,我会做两件事:

  1. 将他们dist的JS文件链接到我的package.json中的关键字(比如ng-dialog
  2. require('ng-dialog')在主JS文件中,以便让我的Angular模块依赖他们

以下是我的package.json的更新相关部分(注意ng对话框是否不需要填充):

"browser": {
  "angular": "./bower_components/angular/angular.min.js",
  "ng-dialog": "./bower_components/ng-dialog/js/ngDialog.min.js"
},
"browserify": {
  "transform": [
    "browserify-shim"
  ]
},
"browserify-shim": {
  "angular": {
    "exports": "angular"
  }
}

和我更新的app.js文件:

'use strict';
var angular = require('angular');
require('ng-dialog');
angular.module('MyApp', ['ngDialog'])
  .controller('View1Ctrl', ['$scope', require('./view1/view1.js')])
  .controller('View2Ctrl', ['$scope', require('./view2/view2.js')]);

我在浏览时出现以下错误:

Error: Cannot find module 'angular' from 'C:'...'bower_components'ng-dialog'js'

经过半个小时的调整,SIMPLYbower_components/ng-dialog中删除package.json文件使一切顺利。

发生了什么事,我到底该如何捆绑ngDialog.min.js

如Browserify手册中所述

browserfy使用的模块系统与node相同,因此发布到npm的包原本是用于node而非浏览器的,在浏览器中也可以正常工作。

越来越多的人将模块发布到npm,这些模块有意设计为使用browserfy在节点和浏览器中工作,npm上的许多包仅用于浏览器。npm适用于所有javascript,无论是前端还是后端。

因此,使用AngularngDialog包装的npm分布,而不是bower包装的

npm install angular ng-dialog --save

这将消除在package.json中进行整个配置的需要,并且在项目中简单地调用require()就可以进行浏览。

当我们需要项目中的任何节点模块时,browserfly捆绑相应节点模块的package.json的main字段中的文件。目前,由于ngDialog的主字段引用了ngDialog.js文件,因此您需要将其更改为ngDialog.min.js,以便browserfy绑定该文件。(这不是一个主要问题,因为你使用gulp-uglify压缩你的浏览捆绑包)

我已经分叉了你的代码并对其进行了必要的更改-请在此处查看https://github.com/pra85/angular-seed