原文發表於:www.rails365.netjavascript
最近你們都在關注一個很流行的相似 webpack 的前端構建工具 Parcel。這個庫剛出來沒多久(好像截至目前十幾天),可是很受歡迎,看下圖就知道。css
因此值得一探!html
官方地址:https://parceljs.org/前端
github 地址:https://github.com/parcel-bundler/parceljava
介紹這個庫以前,咱們來講一下我我的以爲 webpack 的一些很差的地方(相對於 Parcel)。node
須要寫配置文件(webpack.config.js),可能每使用一個功能,好比加載圖片或 css,都要添加配置,要維護配置文件,而 Parcel 不須要。react
而 Parcel 有不少優勢,能夠不使用配置文件,也就是說你只管寫代碼,它會自動運行,很智能化,打個比方吧,好比在 webpack 中若是要處理 css,那得要安裝和加載一個 css 的 loader,而後配置文件寫上幾行,但是 Parcel 不須要,直接用就行。Parcel 學習起來比較簡單,基本上能夠說 "不用學習",只是使用就能夠了。jquery
除此以外,模塊熱替換和代碼拆分的功能,Parcel 也有,還有,若是要你用 Parcel 寫一個 react 的運行環境,可能不須要配置任何內容,只要安裝幾個 react 的包就能夠用起來了。webpack
說了這麼多,我仍是要把官方對它的特性進行歸納的圖片放出來:ios
下面咱們要開始來體驗 parcel 的神奇之處,請跟緊。(源碼我放到 https://github.com/hfpp2012/hello-parcel)
$ npm install -g parcel-bundler
而後初始化一個項目。
$ mkdir parcelapp $ npm init
新建 html 文件。(這個將會是 parcel 的入口文件)
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Joke Generator</title> </head> <body> <div id="wrap"> <h1>Joke</h1> <h3 id="joke"></h3> </div> <p id="copy"></p> <script src="./index.js"></script> </body> </html>
index.js
console.log('Hello');
運行編譯命令。
$ parcel index.html
注意:上面的 parcel 命令接的是 html 文件,它會讀 html 文件的內容,找到 javascript 文件,進行自運處理,不用像 webpack 那樣,還要指定 javascript 的入口文件啥的。
生成了 dist
目錄。
dist ├── index.html └── parcelapp.js
監聽在 1234 端口,瀏覽器效果以下:
新建 jokes.js 文件。
jokes.js
module.exports = { getOne: function () { return new Promise((resolve, reject) => { // 這個 api 是公開的。 fetch('http://api.icndb.com/jokes/random') .then(res => res.json()) .then(data => { resolve(data.value.joke); }) }) } }
index.js
const jokes = require('./jokes'); jokes.getOne() .then(joke => { document.getElementById('joke').innerHTML = joke; });
效果以下:
require
改爲 import
,以下所示:
index.js
// const jokes = require('./jokes'); import { jokes } from './jokes'; jokes.getOne() .then(joke => { document.getElementById('joke').innerHTML = joke; });
jokes.js
export const jokes = { getOne: function () { return new Promise((resolve, reject) => { fetch('http://api.icndb.com/jokes/random') .then(res => res.json()) .then(data => { resolve(data.value.joke); }) }) } }
這只是爲了演示使用一些庫。
首先安裝 axios。
$ npm install axios
注意,這裏每安裝一個庫,都要從新運行 parcel index.html
jokes.js
import axios from 'axios'; export const jokes = { getOne: function() { return new Promise((resolve, reject) => { axios.get('http://api.icndb.com/jokes/random') .then(res => { resolve(res.data.value.joke); }) }) } }
$ npm install jquery
index.js
import { jokes } from './jokes'; import $ from 'jquery'; jokes.getOne() .then(joke => { // document.getElementById('joke').innerHTML = joke; $('#joke').text(joke); });
copyright.txt
Copyright 2018
index.js
import fs from 'fs'; ... const copy = fs.readFileSync(__dirname + '/copyright.txt', 'utf8'); $('#copy').text(copy);
style.css
h1 { color: red; padding-right: 1rem; } #wrap { display: flex; justify-content: center; align-content: center; align-items: center; padding: 5px; border: 1px solid #333; border-radius: 4px; box-shadow: 0 10px 10px rgba(0, 0, 0, 0.12); }
index.html
<!DOCTYPE html> <html lang="en"> <head> ... <link rel="stylesheet" href="style.css" /> <title>Joke Generator</title> </head> <body> ... </body> </html>
backgrounds.css
body { background: #f4f4f4; }
style.css
@import './backgrounds.css'; ...
首先,安裝 node-sass。
$ npm install node-sass
這裏要花費必定時間,請耐心等待
backgrounds.scss
注意:這裏由 backgrounds.css 更名爲 backgrounds.scss
@import './variables.scss'; body { background: $light-grey; }
variables.scss
$light-grey: #f4f4f4;
style.css
/* 更名爲 scss */ @import './backgrounds.scss'; ...
Parcel 還有不少好玩的,咱們之後再說。