Grunt với SASS (Bài trước)

Thực ra để ứng dựng grunt tự động hóa các tác vụ với dự án Javascript cho website đã được trình bày trong các ví dụ ở phần trước, ở đây sẽ tổng kết lại và áp dụng dự án mybootstrap, để sinh ra file .js cho dự án này (Xem lại dự án mybootstrap)

Tổng kết các tác vụ cần thiết làm với với JS

Tác vụ Ý nghĩa/Package cần cài/ví dụ tạo task
copy
Copy file/folder
grunt-contrib-copy
copy: {
  main: {
    expand: true,
    src: 'src/*',
    dest: 'dest/',
  },
},

concat
Tạo ra một file bằng cách nối nhiều file lại
grunt-contrib-concat
concat: {
  build: {
    files: {
        'tmp/all.js' : ['src/hello.js', 'src/ab.js']
    }
  }
},
jshint
Kiểm tra cú pháp Javascript
grunt-contrib-jshint
jshint: {
    options: {
        '-W015': true,
        "esversion": 6
      },
    build: {
      src: ['tmp/all.js']
    },
  },
babel
Convert mã JS viết theo đặc tính kỹ thuật ES6 thành dạng thông thường
Phải cài gói Babel core trước
npm install --save-dev @babel/core @babel/preset-env
Sau đó cài plugin grunt: grunt-babel
babel: {
    options: {
        presets: ['@babel/preset-env']
      },
      build: {
        files: {
          'tmp/filebabel.js': 'tmp/filegoc.js'
        }
      }
},
uglify Nén file JS
uglify: {
    build: {
        files: {
            'build/file.min.js' : ['tmp/file.js']
        }
    },
},

clean Xóa những file tạm thời sinh ra
clean: {
    build: {
        src: ['tmp/*']
      },
}
watch Giám sát file thay đổi grunt-contrib-watch
watch: {
    src: {
        files: ['các file giám sát'],
        tasks: ['tác vụ chạy'],
      },
},

Từ các tác vụ đơn lẻ trên, kết hợp lại sẽ chuỗi tác vụ phức tạp làm việc với JS

Áp dụng với thư viện Boostrap

Trở lại dự án mybootstrap, đã xong phần CSS, giờ là lúc tùy biến với JS

Các thành phần JS phục vụ cho Bootstrap ở thư mục node_modules/bootstrap/js/src/, bạn mở thư mục đó ra thấy có các thành phần JS như alert.js, button.js, collapse.js ... nó phục vụ cho các chức năng của JS. Mặc định Boostrap cung cấp bootstrap.min.js chính là sự tổng hợp của những thành phần này

Giờ bạn muốn tự tổng hợp căn cứ theo thành phần nào bạn cần, đồng thời cho thêm những thành phần riêng của bạn, để build thành file build/mybootstrap.min.js của riêng bạn, dùng cho bootstrap.min.css ở phần trước!

Đầu tiên bạn tạo ra thư mục src/js/ trong đó lưu các file JS riêng của bạn. Ví dụ bạn tao 1 file src/js/hello.js có nội dung:

function helloworld()
{
    console.log("Xin chào XUANTHULAB");
}

Các bước thực hiện

Bước 1 đảm bảo cài đặt tất cả các thư viện cần thiết

File package.json

{
    "name": "mybootstrap",
    "version": "0.1.0",
    "devDependencies": {
        "@babel/core": "^7.1.6",
        "@babel/preset-env": "^7.1.6",
        "grunt": "~0.4.5",
        "grunt-babel": "^8.0.0",
        "grunt-contrib-concat": "~1.0.1",
        "grunt-contrib-uglify": "~0.5.0",
        "grunt-contrib-jshint": "2.0.0",
        "grunt-contrib-clean": "2.0.0",
        "grunt-contrib-watch": "1.0.1",
        "grunt-sass": "~3.0.2",
        "node-sass": "~4.10.0",
        "bootstrap": "4.1.3",
        "grunt-contrib-cssmin": "~3.0.0",
        "grunt-postcss": "~0.9.0",
        "postcss": "~7.0.6",
        "pixrem": "~4.0.1",
        "autoprefixer": "~9.3.1"
    }
}

Có file này rồi, gõ lệnh npm install để cài các package

Bước 2 Kiểm tra cú pháp Javascript của bạn có đúng không

Tác vụ jshint sẽ kiểm tra cú pháp JS, có thiết lập để chấp nhận ES6, nếu code lỗi nó sẽ thông báo

jshint: {
    options: {
        '-W015': true,
        "esversion": 6
      },
    build: {
      src: ['src/js/*.js']
    },
  },

Bước 3 Nối các file JS lại với nhau

Ở bước này, cần dùng file JS nào của bootstrap, cần cho thêm file riêng nào vào thì chỉ ra trong tác vụ concat

concat: {
  options: {
    // Custom function to remove all export and import statements
    process: function (src) {
      return src.replace(/^(export|import).*/gm, '');
    }
  },
  bootstrap: {
    src: [
      //Gộp các JS của bootstrap, không cần cái nào thì comment bỏ đi

      'node_modules/bootstrap/js/src/util.js',
      'node_modules/bootstrap/js/src/alert.js',
      'node_modules/bootstrap/js/src/button.js',
      'node_modules/bootstrap/js/src/carousel.js',
      'node_modules/bootstrap/js/src/collapse.js',
      'node_modules/bootstrap/js/src/dropdown.js',
      'node_modules/bootstrap/js/src/modal.js',
      'node_modules/bootstrap/js/src/scrollspy.js',
      'node_modules/bootstrap/js/src/tab.js',
      'node_modules/bootstrap/js/src/tooltip.js',
      'node_modules/bootstrap/js/src/popover.js',

      //Gộp JS riêng trong thư mục
      'src/js/*.js'


    ],
    dest: 'tmp/js/all.js'
  }
},

Bước 4 Chuyển code JS tương thích ngược với phiên bản cũ

Tác vụ babel sẽ chuyển mã gốc tmp/js/all.js tương thích với các phiên bản cũ, kết quả lưu tại tmp/js/mybootstrap.js

babel: {
        options: {
            presets: ['@babel/preset-env']
          },

          build: {
            options: {
                presets: ['@babel/preset-env']
            },
            files: {
              'tmp/js/mybootstrap.js' : 'tmp/js/all.js'
            }
          }
    },

Bước 5 Nén file JS

Tác vụ uglify nén file JS tmp/js/mybootstrap.js, kết quả lưu tại build/mybootstrap.min.js, đây là file sản phẩm cuối cùng

uglify: {
    build: {
        files: {
            'build/mybootstrap.min.js' : ['tmp/js/mybootstrap.js']
        }
    },
},

Bước 6 Xóa các file tạm trong tmp

   clean: {
        tmp: {
            src: ['tmp/*']
          },
    },

Bước 7 Tổng hợp tất cả các tác vụ

Các tác vụ trên, tổng hợp lại thành một tác vụ tên buildjs

grunt.registerTask('buildjs', ['jshint', 'concat', 'babel:build', 'uglify', 'clean']);

Bước 8 Giám sát file JS

Tạo ra tác vụ watch, để mỗi khi file nguồn JS của bạn thay đổi thì sẽ chạy lại buildjs

watch: {
    scss: {
        files: ['src/customs/*.scss', 'src/mybootstrap.scss'],
        tasks: ['default'],
      },
    js: {
        files: ['src/js/*.js'],
        tasks: ['buildjs'],
    },
},

Để bắt đầu giám sát gõ lệnh: grunt runwatch

Đến đây đã hoàn thành cấu hình dự án, bạn chỉ việc ngồi code các file JS nguồn của mình trong src/js/, mọi thay đổi sẽ tự động build ra mybootstrap.min.js

TỔNG KẾT LẠI

Cùng với bài viết GRUNT SASS BOOTSTRAP, đến đây bạn đã bổ sung thêm tùy biến JS, bạn đã có một dự án tùy biến Bootstrap hoàn chỉnh của riêng mình. Sau khi chạy grunt runwatch, nếu code nguồn sass thay đổi sẽ tự động build ra css, nếu nguồn js thay đổi sẽ tự động build ra mybootstrap.min.js

Mã nguồn tổng hợp ví dụ trên, bạn có thể tải về bằng git

# git clone git@github.com:xuanthulabnet/mybootstrap.git
# git cd mybootstrap
# git checkout master
# npm install

Đăng ký nhận bài viết mới
Grunt với SASS (Bài trước)