Как включить node_modules в отдельный пакет поставщика услуг для браузера
Я пытаюсь преобразовать приложение AngularJS для использования браузера. Я установил все свои пакеты bower в node_modules с помощью napa. Теперь я хочу их обозревать в отдельный комплект поставщиков и объявить их как "внешние" зависимости. Я хотел бы дать им псевдонимы, чтобы я мог "потребовать (" angular ") вместо" require ( "angular/angular" ) ", как кажется, вы можете делать с внешними.
В примерах, которые я видел (например, http://benclinkinbeard.com/posts/external-bundles-for-faster-browserify-builds/), все предполагают, что я сбросил файлы поставщика в каталог 'lib'. Я хочу просто связать файлы своего поставщика с node_modules. Кажется, что это должно быть легко, но я не вижу, как это сделать.
Ответы
Ответ 1
Я просто пытался сделать то же самое. Я думаю, вам нужно использовать --require
для пакета поставщиков и --export
для приложения, так что зависимости не получаются в комплекте дважды.
Это работало для меня с помощью браузера api и gulp (lodash и pixijs были моими node_modules):
var gulp = require('gulp');
var browserify = require('browserify');
var handleErrors = require('../util/handleErrors');
var source = require('vinyl-source-stream');
gulp.task('libs', function () {
return browserify()
.require('lodash')
.require('pixi.js')
.bundle()
.on('error', handleErrors)
.pipe(source('libs.js'))
.pipe(gulp.dest('./build/'));
});
gulp.task('scripts', function () {
return browserify('./src/main.js')
.external('lodash')
.external('pixi.js')
.bundle()
.on('error', handleErrors)
.pipe(source('main.js'))
.pipe(gulp.dest('./build/'));
});
gulp.task('watch', function(){
gulp.watch('src/**', ['scripts']);
});
gulp.task('default', ['libs', 'scripts', 'watch']);
Конечно, это решение является болью для поддержания... Поэтому я исправил браузеру, чтобы принимать массивы в require
и external
, а затем вы можете сделать это, что я думаю, что это намного лучше:
var gulp = require('gulp');
var browserify = require('browserify');
var handleErrors = require('../util/handleErrors');
var source = require('vinyl-source-stream');
var packageJson = require('../../package.json');
var dependencies = Object.keys(packageJson && packageJson.dependencies || {});
gulp.task('libs', function () {
return browserify()
.require(dependencies)
.bundle()
.on('error', handleErrors)
.pipe(source('libs.js'))
.pipe(gulp.dest('./build/'));
});
gulp.task('scripts', function () {
return browserify('./src/main.js')
.external(dependencies)
.bundle()
.on('error', handleErrors)
.pipe(source('main.js'))
.pipe(gulp.dest('./build/'));
});
gulp.task('watch', function(){
gulp.watch('package.json', ['libs']);
gulp.watch('src/**', ['scripts']);
});
gulp.task('default', ['libs', 'scripts', 'watch']);
Это лучшее, что я мог придумать... Пожалуйста, дайте мне знать, если вы найдете лучший способ.
Ответ 2
Я также сталкиваюсь с этой проблемой. Потому что это был огромный файл, когда вся библиотека поставщика в том же файле. Поэтому браузер всегда застревает с загрузкой более 10 МБ файла. Минимизация файлов также не была решением, потому что потребовалось больше времени для компиляции, и это не помогло в разработке.
Я сохранил vendor.js
и app.js
для отдельных модулей node и сценариев приложений. Это так.
Пример vendor.js(src/app/vendor.js)
/**
* Node modules
*/
require('angular');
require('angular-cookies');
require('angular-ui-router');
require('angular-aria');
require('angular-animate');
....
Пример app.js(src/app/app.js)
/**
* App Common Modules
*/
require('./modules/about/about.routing.js');
require('./modules/home/home.routing.js');
/**
* Services
*/
require('./shared/services/order.js');
require('./shared/services/product.js');
/**
* Directives
*/
require('./shared/directives/dropzone.js');
require('./shared/directives/tab-change.js');
angular
.module('myApp', [
//------------- Node modules ------------//
'ui.router',
'ngMaterial',
//------------- App Common modules ------------//
//About
'cloudDecor.routing.about',
'cloudDecor.controller.about',
//Home
'cloudDecor.routing.home',
'cloudDecor.controller.home',
//------------- Services --------------//
'cloudDecor.service.order',
//------------- Directives ------------//
'cloudDecor.directive.dropzone',
'cloudDecor.directive.tab-change'
]);
gulpfile.js
var gulp = require('gulp'),
browserify = require('browserify'),
uglify = require('gulp-uglify'),
buffer = require('vinyl-buffer');
//App js
gulp.task('app_js', function() {
// Grabs the app.js file
browserify({
entries: ['./src/app/app.js'],
debug: true
})
.bundle()
.pipe(source('main.js'))
.pipe(buffer())
.pipe(gulp.dest('./build/'));
});
//Vendor js
gulp.task('vendor_js', function() {
// Grabs the app.js file
browserify({
entries: ['./src/app/vendor.js']
})
.bundle()
.pipe(source('vendor.min.js'))
.pipe(buffer())
.pipe(uglify({ mangle: false }))
.pipe(gulp.dest('./build/'));
});
gulp.task('default', ['app_js', 'vendor_js']);
Обязательно включите vendor.js
перед использованием main.js
в index.html
<html>
<body>
<!--Vendor js, See src/vendor.js-->
<script type="text/javascript" src="vendor.min.js"></script>
<!--App scripts, See src/app.js-->
<script type="text/javascript" src="main.js"></script>
</body>
</html>