2016/12/20

Webpack With Vendor

ๅ‰่จ€

ไน‹ๅ‰ๅฏซ้Ž้€™็ฏ‡ webpack,ๅ–ฎไธ€่จญๅฎš webpack ็š„ๆ–นๅผ,ไธ€่ˆฌไพ†่ชช็‚บไบ†ๆธ›ๅฐ‘ request,ๆ‰€ไปฅๆœƒๅธŒๆœ›ๅฐ‡ js ๆช”ๆกˆ compile ๆˆไธ€ๅ€‹,้€™็จฎๆขไปถไฝ ไธๆ˜ฏๅพž้ ญๅˆฐๅฐพๆ‰“้€ ้€™ๅ€‹็ถฒ็ซ™็š„ไฝœ่€…,ไบ†่งฃๆฏๅ€‹้ ้ข dom ๅธƒๅฑ€็š„่ฉฑๆ˜ฏ็›ธ็•ถๅ›ฐ้›ฃ็š„,่€Œไธ”ๅพž HTTP/2 ็š„ๆ–ฐๆจ™ๆบ–ๅ‡บ็พไปฅๅพŒ,้€™ๆ‹›ๅทฒ็ถ“ๆฒ’ๆœ‰ๆ˜Ž้กฏ็š„ๅ„ชๅ‹ขไบ†,ๅฏไปฅๅƒ่€ƒ 「ไฝ ็š„็ถฒ็ซ™ๅ‡็ดšๅˆฐ HTTP/2 ไบ†ๅ—Ž?」้€™็ฏ‡ๆ–‡็ซ 。

ๆ‰€ไปฅ้€™็ฏ‡ๆ–‡็ซ ๆœƒ้‡ๆ–ฐๆ•™ๅญธๆ€Ž้บผ่จญๅฎš,่ฎ“ไฝ ๆฏๅ€‹็ถฒ้ ๆœ‰ๅฑฌๆ–ผ่‡ชๅทฑ็š„ js ๆช”ๆกˆ,ไฝ†ๅ…ฑ็”จ็š„ๅฅ—ไปถๅฆ‚ jQuery ๆˆ– bootstrap ๅปๅฏไปฅ็จ็ซ‹,ๆธ›ๅฐ‘็จ็ซ‹ๆช”ๆกˆ็š„ๅคงๅฐ。

ๅฎ‰่ฃ็›ธ้—œๅฅ—ไปถ

npm i --save-dev webpack babel-core babel-loader babel-preset-es2015
npm i --save jquery bootstrap

็›ฎๅ‰ไธป่ฆ้‚„ๆ˜ฏ็”จ babel ็ทจ่ญฏ่ผƒๆ–ฐ็ฉŽ็š„ JavaScript ่ชžๆณ•。

ๆช”ๆกˆๅธƒๅฑ€

webpack.config.js
const webpack = require('webpack');
const path = require('path');

module.exports = {
    entry: {
        a: path.resolve(__dirname, 'js/src/a'),
        b: path.resolve(__dirname, 'js/src/b'),
        vendor: ['jquery', 'bootstrap']
    },
    output: {
        path: path.resolve(__dirname, 'js/build/'),
        filename: '[name].js'
    },
    plugins: [
        new webpack.optimize.CommonsChunkPlugin('vendor', 'vendor.bundle.js'),
        new webpack.ProvidePlugin({
            $: 'jquery',
            jQuery: 'jquery'
        }),
        new webpack.optimize.UglifyJsPlugin({
            compress: {
                warnings: false
            }
        })
    ],
    module: {
        loaders: [
            { test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader' }
        ]
    }
};

้€™ๅ€‹่จญๅฎšๆช”้ ่จˆ่ฆๅฐ‡ js/src/ ไธ‹็š„ a.js ไปฅๅŠ b.js compile ๅˆฐ js/build/,ไธฆๅฐ‡ jQuery ไปฅๅŠ bootstrap ๆŠฝๅ‡บไพ†ๆˆ็‚บ vendor,่จญๅฎšๅฎŒๆˆๅพŒ,ๅœจๆ น็›ฎ้Œ„ๅŸท่กŒ webpack,็ทจ่ญฏๅพŒๅœจ js/build/ ไธ‹ๆœƒ็œ‹ๅˆฐ a.js, b.js, vendor.bundle.js ไธ‰ๅ€‹ๆช”ๆกˆ。

.babelrc
{
  "presets": ["es2015"]
}

้€™ๆ˜ฏ babel ็š„่จญๅฎšๆช”。

js/src/a.js
$(function() {
    $('body').append('this is a');
});
js/src/b.js
$(function() {
    $('body').append('this is a');
});
js/src/b.js
$(function() {
    $('body').append('this is b');
});
a.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>webpack page a</title>
    <script src="js/build/vendor.bundle.js"></script>
    <script src="js/build/a.js"></script>
</head>
<body>
    <h3>this is a</h3>
</body>
</html>
b.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>webpack page b</title>
    <script src="js/build/vendor.bundle.js"></script>
    <script src="js/build/b.js"></script>
</head>
<body>
    <h3>this is b</h3>
</body>
</html>

ๅŸท่กŒ a.htmlไปฅๅŠ b.html ๅฐฑๆœƒ็œ‹ๅˆฐๅ„่‡ช็š„ๆ•ˆๆžœไบ†。

2016/12/18

Google reCAPTCHA On Codeigniter

ๅ‰่จ€

็‚บไบ†้ฟๅ…็ถฒ็ซ™่ขซ robot ๆŽƒๆจกๅš้‡่ค‡ๆ€ง็š„ๅ‹•ไฝœ,ไพ‹ๅฆ‚ๅŠ ๅ…ฅๆœƒๅ“ก,็”ณ่ซ‹ๅฟ˜่จ˜ๅฏ†็ขผ็ญ‰็ญ‰,ๆˆ‘ๅ€‘ๆœƒๆ”พไธ€ๅ€‹ๅฟ…้ ˆไบบ็‚บ่ผธๅ…ฅ็š„ๆฌ„ไฝไธฆไธ”่ฎ“ robot ้›ฃไปฅ่พจ่ญ˜็ ด่งฃ,ๅธธ่ฆ‹็š„ๆœƒๆœ‰ๆ–‡ๅญ—ไปฅๅŠๆ•ธๅญ—็š„ๅœ–ๅƒๅŒ–่ผธๅ…ฅ,ไฝ†ๆœ‰็š„ๆฉŸๅ™จไบบๅฆ‚ๆžœๆ‹ฟๅˆฐ่ฆๅพ‹ไปฅๅŠ่ถณๅค ็š„ๆจฃๆœฌ,็ด”ๆ–‡ๅญ—็š„่ผธๅ…ฅๆ–นๅผๆ˜ฏๅฏ่ƒฝ่ขซ็ ด่งฃ็š„,Google ๅ‡บ็š„ reCaptcha ๅฑฌๆ–ผๅœ–ๅƒๅŒ–็š„้ธๆ“‡้ฉ—่ญ‰,ไธ็ฎกๆ˜ฏๆŽ’ๅˆ—ไฝ็ฝฎๆˆ–ๆ˜ฏ็จฎ้กž็š„ๅคšๆจฃๆ€ง้ƒฝ้›ฃไปฅๅŽป็ ด่งฃ,ๅœจ้€™้‚Š็คบ็ฏ„ไธ€ไธ‹ๆ€Ž้บผๆ•ดๅˆ ci ไฝฟ็”จ

ๅฏฆๅš

ๅฅ—ไปถๅฎ‰่ฃ

้ฆ–ๅ…ˆๅฎ‰่ฃ google/recaptcha ้€™ๅ€‹ๅฅ—ไปถ,ๆˆ‘ๅœจ codeigniter ไธŠๆœ‰ไฝฟ็”จ composer,ๅœจ config/config.php ไธ‹ๅฏไปฅๆ‰“้–‹,ไฝฟ็”จๆ–นๆณ•่ทŸๅœจ Laravel ไธŠไธ€ๆจฃ

็จ‹ๅผ็ขผ

application/controllers/Recaptcha.php
<?php

defined('BASEPATH') OR exit('No direct script access allowed');

class Recaptcha extends CI_Controller
{
    public function index()
    {
        $this->load->helper('form');
        $this->load->helper('url');
        $this->load->view('recaptcha/form');
    }

    public function result()
    {
        $this->load->library('form_validation');

        $status = 'done';
        $message = 'done';
        $secret = '6LfsIQ8UAAAAAOveAzcFb6A_3Yiv_QdfR-qo5qld';

        try {
            $this->form_validation->set_rules('username', 'username', 'required');
            $this->form_validation->set_rules('g-recaptcha-response', 'captcha', 'required');

            if (!$this->form_validation->run()) {
                throw new Exception(validation_errors(null, null));
            }

            $gRecaptchaResponse = $this->input->post('g-recaptcha-response');
            $remoteIp = $this->input->ip_address();
            $recaptcha = new \ReCaptcha\ReCaptcha($secret);
            $resp = $recaptcha->verify($gRecaptchaResponse, $remoteIp);

            if (!$resp->isSuccess()) {
                $errors = $resp->getErrorCodes();
                throw new Exception(current($errors));
            }
        } catch (Exception $e) {
            $status = 'fail';
            $message = $e->getMessage();
        }

        $this->output
            ->set_content_type('application/json')
            ->set_output(json_encode(compact('status', 'message')));
    }
}
application/views/recaptcha/form.php
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>reCAPTCHA Demo</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <script src='https://www.google.com/recaptcha/api.js'></script>
    <script type="text/javascript" charset="utf-8">
    var baseUrl = "<?php echo base_url(); ?>";

    $(function() {
        $('#recaptcha_form').on('submit', function() {
            var data = $(this).serialize();

            $.post(baseUrl + 'recaptcha/result', data, function(response) {
                alert(response.message);

                if (response.status === 'done') {
                    grecaptcha.reset();
                }
            }, 'json');

            return false;
        });
    });
    </script>
</head>
<body>
    <?php echo form_open('recaptcha/result', ['id' => 'recaptcha_form']); ?>
    <div><?php echo form_input('uername', 'chan'); ?></div>
    <div class="g-recaptcha" data-sitekey="6LfsIQ8UAAAAAFmYCwSLpfKgWtqK1SlVfMcPn2Q6"></div>
    <div><?php echo form_submit('go', 'go'); ?></div>
    <?php echo form_close(); ?>
</body>
</html>

ไฝฟ็”จ reCAPTCHA ่ฆๅ…ˆๅŽป็”ณ่ซ‹ key ่ทŸ secret,้€™้ƒจไปฝๆˆ‘ๅฐฑไธ่ฌ›่งฃไบ†,้€™ไปฝ็จ‹ๅผ็ขผไธป่ฆๅŠŸ่ƒฝๅฐฑๆ˜ฏ้ฉ—่ญ‰ๆ˜ฏๅฆๆœ‰่ผธๅ…ฅ username ไปฅๅŠ reCAPTCHA,ๆœ‰็š„่ฉฑๅ†้€ฒไธ€ๆญฅ้ฉ—่ญ‰ captcha ๆญฃ็ขบๆ€ง,ๅฆ‚ๆžœไฝ ไธๆƒณไฝฟ็”จๅฅ—ไปถ็š„้Œฏ่ชค่จŠๆฏ,้‚ฃไธ€ๆ—ฆๅ ฑ้Œฏไฝ ๅช่ฆ้กฏ็คบ captcha ้Œฏ่ชคๅณๅฏ,ๆœ‰ไบ›่กจๅ–ฎ้€ๅ‡บๅพŒไธไธ€ๅฎšๆœƒๆ›้ ,ๆ‰€ไปฅๆˆ‘ๅŠ ไบ†ๅ€‹ script ๅฆ‚ๆžœๅตๆธฌๅˆฐ้€™ๆฌก็š„่กŒ็‚บๆญฃ็ขบ็š„ๆ™‚ๅ€™ refresh ไธ€ๅ€‹ๆ–ฐ็š„ captcha,่ชžๆณ•็š„ไฝฟ็”จๆ™‚ๆฉŸๅฏไปฅ็œ‹ไฝฟ็”จ่€…็š„ไฝฟ็”จๆƒ…ๆณๅŽป่ชฟๆ•ดๆญ้…