Angular + webpack + bootstrap的开发环境配置③

由于环境已经准备好,我希望能够开始制作样本。
我认为这也可以作为Angular + webpack + bootstrap开发环境搭建①和②内容的总结。

源代码已在Github上公开,您也可以参考那里的内容。
实际上,与其阅读说明,不如直接查看源代码更容易理解。
https://github.com/yohei-takara/JavaScriptEnvironment.git

目录结构

以前已经写过了,考虑到在服务器端使用Java或Ruby,因此决定在webpack生成的源代码和原始代码中进行分开管理,分别放在不同的目录下。
因为我想不到一个好的原始代码管理目录名称,所以就称之为webpack吧……
唉~感觉有些微妙,但总之先不纠结了(´﹃`)

我打算将实际的目录结构设计成这样的感觉。

|--- public                // 外部に公開するディレクトリ  
|  |-- assets              // webpack で 生成したjs,cssが吐かれるディレクトリ  
|  |-- index.html          // サンプルHTML。
|
|--- webpack               // webpack でのコンパイル対象となるファイルはここに配置  
|  |-- src                 // コンパイル前のソースを配置
|  |-- package.json        // npm 設定ファイル
|  |-- webpack.config.js   // webpack 設定ファイル
|

创建HTML

作为动作确认,只要能确认Angular和bootstrap能正常运行即可。
我希望Angular实现双向数据绑定,而bootstrap只需要实现简单的HTML弹出提示框。

webpack生成的css将存放在public/assets/stylesheets/.bundle.css中。而javascript将存放在public/assets/javascript/.bundle.js中。因此,将会加载这些样式。

<link rel="stylesheet" href="assets/stylesheets/application.bundle.css">

关于JavaScript,

<script type="text/javascript" src="assets/javascript/application.bundle.js"></script>

确认Bootstrap工具提示

关于bootstrap的工具提示,由于官方非常详细地列出了使用方法等细节,因此在此省略不表。
http://v4-alpha.getbootstrap.com/components/tooltips/

我們決定對於Font Awesome的圖標提供tooltip。

<div data-toggle="tooltip" data-placement="top" data-html="true" title="<div class='tooltip-inner'>Webpack Environment!!!!!</div>">
    <i class="fa fa-thumbs-o-up fa-5x" aria-hidden="true"></i>
</div>

检查Angular双向数据绑定。

将输入的内容与屏幕上显示的内容相同的形式进行构建。
通过更改输入内容,可以改变显示的文字,以检查数据绑定。

<div ng-app="app"  ng-cloak>
    <div ng-controller="webpackEnvironmentCtrl" ng-init="init()">
        <input type="text" ng-model="demo" ng-value="demo">
        <div>{{ demo }} </div>
    </div>
</div>

写剧本

为了使Angular和Bootstrap提示框在JavaScript中工作,你需要编写两个jQuery代码。

工具提示

如果在官方网页上搜索的话

$(function () {
  $('[data-toggle="tooltip"]').tooltip()
})

这样写的话,在使用angular的ng-repeat等动态更改DOM时,tooltip将无法显示(对于动态生成的部分)。所以稍作修改,

$(function() {
    //ツールチップ
    $('body').tooltip({
        selector: '[data-toggle="tooltip"]'
    });
});

我会设想这种情况。

Angular (角度)

关于angular,
因为还要确认webpack,所以没有必要特意分开,
我们决定把module和contorller分别创建为两个文件。

由于未来我们计划将模块扩展为SAP,所以我预先将ngRoute进行了依赖注入。就本次而言,这并不是必需的。

module.exports.angApp = angular.module("app", ["ngRoute"]);

我将创建一个控制器,只需编写初始化处理的简单代码。

let angModule = require('./module');
require('./config');

angModule.angApp.controller("webpackEnvironmentCtrl", ['$scope', "$log", function($scope, $log) {
    $scope.init = function() {
        $log.debug('Webpack Environment!!!!!!!!!!!');
        $scope.demo = 'Webpack Environment!!!!!!!!!!!';
    };

}]);

在编写过程中,我考虑到只有在开发时才想要输出调试日志,因此我添加了配置选项。

let angModule = require('./module');

angModule.angApp.config(["$logProvider", function($logProvider) {
    // $log.debug の表示設定
    $logProvider.debugEnabled(true);
}]);

我们假设这样。

使用Webpack进行编译

我会创建一个可以编译的js文件。

// style library
require("bootstrap/dist/css/bootstrap.css");
require("bootstrap/dist/css/bootstrap-theme.min.css");
require("font-awesome/css/font-awesome.css");

// javascript library
let $ = require("jquery");
let angular = require("angular");
require("bootstrap/dist/js/bootstrap.js");
require("angular-cookies");
require("angular-route");

// jquery module
require("./javascript/jquery/actionTooltip");
// angular module
require("./javascript/angular/controller");

我們將使用Webpack編譯這個已創建的JavaScript檔案。

var DEBUG = process.env.NODE_ENV === 'development' || process.env.NODE_ENV === undefined;
var webpack = require('webpack');
var path = require('path');

var ExtractTextPlugin = require('extract-text-webpack-plugin');

var devtool = DEBUG ? '#inline-source-map' : '#eval';
var plugins = [ new webpack.ProvidePlugin({ jQuery: "jquery", $: "jquery", jquery: "jquery" }), new ExtractTextPlugin('stylesheets/[name].bundle.css') ];

if (!DEBUG) {
    plugins.push( new webpack.optimize.UglifyJsPlugin({compress: {warnings: false}}) );
}

module.exports = {
    entry: {
        'application': './src/webpackEnvironment.js',
    },
    output: {
        path: '../public/assets',
        filename: 'javascript/[name].bundle.js'
    },
    devtool: devtool,
    plugins: plugins,
    resolve: {
      root: [ path.join(__dirname, "node_modules") ],
      extensions: ['', '.js', '.css']
    },
    module: {
        loaders: [
            // **IMPORTANT** This is needed so that each bootstrap js file required by
            // bootstrap-webpack has access to the jQuery object
            { test: /bootstrap\/js\//, loader: 'imports?jQuery=jquery' },

            // loads css
            { test: /\.css$/, loader: ExtractTextPlugin.extract('style-loader', 'css-loader') },
            { test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?mimetype=image/svg+xml' },
            { test: /\.woff(\d+)?(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?mimetype=application/font-woff' },
            { test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?mimetype=application/font-woff' },
            { test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: 'url-loader?mimetype=application/font-woff' }
        ]
    }
};

为了能够修改生产和开发环境,我将创建一个npm脚本。

{
  "name": "webpackTest",
  "version": "1.0.0",
  "description": "webpack test project",
  "main": "webpack.config.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "clean": "rm -r node_modules/ && npm cache clean",
    "devBuild": "NODE_ENV=development webpack --display-error-details",
    "build": "NODE_ENV=production webpack"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "angular": "^1.5.9",
    "angular-cookies": "^1.5.9",
    "angular-route": "^1.5.9",
    "bootstrap": "^3.3.7",
    "font-awesome": "^4.7.0",
    "jquery": "^2.2.4"
  },
  "devDependencies": {
    "css-loader": "^0.26.1",
    "extract-text-webpack-plugin": "^1.0.1",
    "file-loader": "^0.9.0",
    "style-loader": "^0.13.1",
    "url-loader": "^0.5.7",
    "webpack": "^1.13.3"
  }
}

现在准备工作已经完成,我们开始运行webpack。

$ npm run build

又或者

$ npm run devBuild

本番用和开发用之间的区别是,本番用是进行 “无souce-map、压缩编译”,而开发用是进行 “有souce-map、未压缩编译”。

只要在 public/assets/ 下生成了 js 和 css 文件,就可以通过浏览器打开 index.html 并确认是否正常运行,完成了。

这次尝试中的问题

在Angular的config中,配置$logProvider的设定。

$logProvider.debugEnabled(true);

尽管我们通过webpack成功地将production和develop进行了区分,但是现在我们不得不手动修改源代码来调试日志,这真的很不好。

我希望能够通过webpack来实现在这里的切换。 ╭( ・ㅂ・)و ̑̑ グッ !

2016/12/09 补充记录

根据 http://qiita.com/mikakane/items/5ab96c4c7e187ab6c9f1 的文章进行模仿,通过修改webpack以更改debug日志的输出与否。

var LOG_ENV = false;
var plugins = [];

if (DEBUG) {
  LOG_ENV = true;
}

plugins.push( new webpack.DefinePlugin( { DEBUG_LOG_ENV: LOG_ENV  }) );
$logProvider.debugEnabled( DEBUG_LOG_ENV );
    1. 使用webpack插件DefinePlugin来设置DEBUG_LOG_ENV。

 

    1. DEBUG_LOG_ENV的值在生产环境下为true,在开发环境下为false。

 

    在Angular的配置文件中,将DEBUG_LOG_ENV设置为$logProvider.debugEnabled()的值。

现在,在开发时可以配置webpack的转译,使其能够输出log并方便进行调试,而在生产环境中则不会输出log。

只要像这样,在各个环境中需要设置不同的值时,应该可以在不更改源码的情况下进行设置,这样看来应用场景应该很多。

Angular + webpack + bootstrap 的开发环境搭建①
Angular + webpack + bootstrap 的开发环境搭建②
Angular + webpack + bootstrap 的开发环境搭建③

广告
将在 10 秒后关闭
bannerAds