2015-02-21 2 views
46

Как вы используете Webpack и AngularJS вместе, и как насчет загрузки шаблона и выборки по требованию?Какова наилучшая практика для импорта angularjs с помощью webpack?

Пример хорошо написанного файла webpack.config.js для этой цели был бы очень признателен.

Все приведенные здесь фрагменты кода можно получить по адресу this github repo. Код был щедро адаптирован от this packetloop git repo.

webpack.config.json

var path = require('path'); 
var ResolverPlugin = require("webpack/lib/ResolverPlugin"); 

var config = { 
    context: __dirname, 
    entry: ['webpack/hot/dev-server', './app/app.js'], 
    output: { 
    path: './build', 
    filename: 'bundle.js' 
    }, 
    module: { 
    loaders: [{ 
     test: /\.css$/, 
     loader: "style!css-loader" 
    }, { 
     test: /\.scss$/, 
     loader: "style!css!sass?outputStyle=expanded" 
    }, { 
     test: /\.jpe?g$|\.gif$|\.png$|\.svg$|\.woff$|\.ttf$/, 
     loader: "file" 
    }, { 
     test: /\.html$/, 
     loader: "ngtemplate?relativeTo=" + path.join(__dirname, 'app/') + "!raw" 
    }] 
    }, 
    // Let webpack know where the module folders are for bower and node_modules 
    // This lets you write things like - require('bower/<plugin>') anywhere in your code base 
    resolve: { 
    modulesDirectories: ['node_modules', 'lib/bower_components'], 
    alias: { 
     'npm': __dirname + '/node_modules', 
     'vendor': __dirname + '/app/vendor/', 
     'bower': __dirname + '/lib/bower_components' 
    } 
    }, 
    plugins: [ 
    // This is to help webpack know that it has to load the js file in bower.json#main 
    new ResolverPlugin(
     new ResolverPlugin.DirectoryDescriptionFilePlugin("bower.json", ["main"]) 
    ) 
    ] 
}; 

module.exports = config; 

Чтобы импортировать AngularJS в основной app.js вы делаете следующее:

приложение/поставщик/angular.js

'use strict'; 

if (!global.window.angular) { 
    require('bower/angular/angular'); 
} 
var angular = global.window.angular; 
module.exports = angular; 

И затем используйте его в app.js, как и так,

app.js

... 
var angular = require('vendor/angular'); 

// Declare app level module 
var app = angular.module('myApp', []); 

... 

ли следующие правильно? Есть ли более простой способ сделать это? Я видел несколько (не много по стандартам) сообщений, в которых перечислялся другой метод.

От this reddit post comment

// Add to webpack.config.js#module#loaders array 
    { 
     test: /[\/]angular\.js$/, 
     loader: "exports?angular" 
    } 

Существует также еще один плагин, который находится в стадии разработки прямо сейчас, в stackfull/angular-seed. Кажется, это в правильном направлении, но сейчас действительно очень сложно использовать.

Webpack - это потрясающе, но отсутствие документации и образцов убивают его.

+1

Угловая сам прекрасно работает из коробки с WebPack - 'вар угловые = требуют ('углового')'. Вы также можете потребовать, чтобы ваши модули имели свойство 'name' на каждом модуле -' var myModule = require ('./ myModule'); angular.module ('foo', [myModule.name]) '. Есть несколько исключений: ui router, являющийся заметным, не экспортирует объект модуля, а сам модуль. –

+0

Это также может быть хорошим местом для начала. Это помогло мне. https://egghead.io/lessons/angularjs-angular-with-webpack-introduction – mgmcdermott

+1

угловой не работает из коробки с синтаксисом: var angular = require ('angular') без вашего приложения/поставщика/angular.js , Если вы используете экспортный загрузчик и используете угловой, вы можете заставить его работать без вашего поставщика/angular.js. Также обратите внимание, что ваши зависимости должны быть зависимыми от npm. Зависимости Bower не будут работать с экспортным загрузчиком. – randominstanceOfLivingThing

ответ

6

Я начинаю с Angular + Flux с Webpack так может быть, я могу помочь вам с некоторыми вещами.

В основном я устанавливаю все с NPM, он имеет систему module export, поэтому он работает как ничто. (Вы можете использовать export-loader, но почему, если вам не нужно.)

Мои webpack.config.js выглядит следующим образом:

var webpack   = require('webpack'); 
var path    = require('path'); 
var HtmlWebpackPlugin = require("html-webpack-plugin"); 

var nodeModulesDir = path.resolve(__dirname, './node_modules'); 

// Some of my dependencies that I want 
// to skip from building in DEV environment 
var deps = [ 
    'angular/angular.min.js', 
    ... 
]; 

var config = { 
    context: path.resolve(__dirname, './app'), 

    entry: ['webpack/hot/dev-server', './main.js'], 

    resolve: { 
    alias: {} 
    }, 

    output: { 
    path: path.resolve(__dirname, './build'), 
    filename: 'bundle.js' 
    }, 

    // This one I am using to define test dependencies 
    // directly in the modules 
    plugins: [ 
    new webpack.DefinePlugin({ 
     ON_TEST: process.env.NODE_ENV === 'test' 
    }) 
    ], 

    module: { 
    preLoaders: [ 
     {test: /\.coffee$/, loader: "coffeelint", exclude: [nodeModulesDir]} 
    ], 
    loaders: [ 
     {test: /\.js$/, loader: 'ng-annotate', exclude: [nodeModulesDir]}, 
     {test: /\.coffee$/, loader: 'coffee', exclude: [nodeModulesDir]}, 
     ... 
    ], 
    noParse: [] 
    }, 

    devtool: 'source-map' 
}; 

if (process.env.NODE_ENV === 'production') { 
    config.entry = { 
    app: path.resolve(__dirname, './app/main.js'), 
    vendors: ['angular'] 
    }; 
    // config.output.path = path.resolve(__dirname, './dist'); 
config.output = { 
    path: path.resolve(__dirname, "./dist"), 
    filename: "app.[hash].js", 
    hash: true 
}; 
config.plugins.push(new webpack.optimize.UglifyJsPlugin()); 
config.plugins.push(new webpack.optimize.CommonsChunkPlugin('vendors', 'vendors.[hash].js')); 
config.plugins.push(new HtmlWebpackPlugin({ 
    title: 'myApp', 
    template: path.resolve(__dirname, './app/index.html'), 
    inject: 'body' 
})); 

delete config.devtool; 


} 
    else { 
    deps.forEach(function (dep) { 
     var depPath = path.resolve(nodeModulesDir, dep); 
     config.resolve.alias[dep.split(path.sep)[0]] = depPath; 
     config.module.noParse.push(depPath); 
    }); 
    } 
module.exports = config; 

Мои main.js выглядит следующим образом:

var angular = require('angular'); 

if(ON_TEST) { 
    require('angular-mocks/angular-mocks'); 
} 

require('./index.coffee'); 

И index.coffee containt главный угловой модуль:

ngModule = angular.module 'myApp', [] 

require('./directive/example.coffee')(ngModule) 
+0

это невероятно. Поздравления. Этот код является открытым исходным кодом? Я хотел бы взглянуть на проект, у меня есть [некоторые проблемы] (http://stackoverflow.com/questions/33502112/webpack-with-bower-support) с помощью Webpack. :) – ridermansb

+2

Я сделаю репо на github и отредактирую это сообщение соответственно через несколько дней. – Kamil

+0

@ Камил, ты обошел это репо? Мне бы очень понравилось это видеть. По крайней мере, cna вы показываете мне, как выглядит файл './Directive/example.coffee'? – anbiniyar

8

Вы можете просто потребовать угловой во всех модулях (файлах) там, где это необходимо. У меня есть github repository с примером, как это сделать (также с помощью webpack for build). В примере используется синтаксис импорта ES6, но это не имеет значения, вместо этого вы можете использовать стандартный require().

Пример:

import 'bootstrap/dist/css/bootstrap.min.css'; 
import './app.css'; 

import bootstrap from 'bootstrap'; 

import angular from 'angular'; 
import uirouter from 'angular-ui-router'; 

import { routing} from './app.config'; 

import common from './common/common.module'; 

import featureA from './feature-a/feature-a.module'; 
import featureB from './feature-b/feature-b.module'; 

const app = angular 
    .module('app', [uirouter, common, featureA, featureB]) 
    .config(routing); 
+0

Не должно быть 'uirouter.name' и т. Д. Внутри зависимостей углового модуля? –

+0

работает так, посмотрите на настоящий пример: https://github.com/tomastrajan/angular-js-es6-testing-example/blob/master/src/feature-b/feature-b.module.js – tomastrajan

+0

Вы правы, спасибо! –

Смежные вопросы