很長時間沒有更新博客了,實在是太忙啦...0.0 ,如下的東西純粹是記錄,不是我原創,放到收藏夾還擔憂不夠,這個之後經常使用,想來想去,仍是放到這裏吧,,丟不了..最後一句廢話,網上搜集也好原創也罷,能解決問題不糊弄人才是真道理!javascript
反正個人問題解決啦!!!哈哈哈!!css
安裝grunthtml
原文:www.bluesdream.com/blog/Windows-installs-the-grunt-and-instructions.html前端
怕這個網址打不開,記錄下:java
安裝Grunt:
若是你以前安裝過老的0.3版本,請先卸載:
npm uninstall -g gruntnode
安裝Grunt命令行(CLI):
npm install -g grunt-clilinux
注1:-g表明全局安裝,Grunt有二個版本:服務器端版本(grunt)和客戶端版本(grunt-cli)。git
注2:安裝grunt-cli並不等於安裝了grunt!grunt CLI的任務很簡單:調用與Gruntfile在同一目錄中的grunt。這樣帶來的好處是,容許你在同一個系統上同時安裝多個版本的grunt。而grunt使用模塊結構,除了安裝命令行界面之外,還要根據須要安裝相應的模塊。這些模塊應該採用局部安裝,由於不一樣項目可能須要同一個模塊的不一樣版本。ajax
上述命令執行完後,grunt 命令就被加入到你的系統路徑中了,之後就能夠在任何目錄下執行此命令了。npm
建立新的Grunt項目:
假設這個項目安裝在D盤根目錄,咱們首先進度D盤:
d:
建立項目文件夾:
mkdir testProject
進入文件夾:
cd testProject
接着在你的項目文件夾根目錄下添加兩個文件:package.json 和 Gruntfile。
package.json: 此文件被npm用於存儲項目的元數據,以便將此項目發佈爲npm模塊。
Gruntfile: 此文件被命名爲 Gruntfile.js 或 Gruntfile.coffee,用來配置或定義任務(task)並加載Grunt插件。
建立package.json文件:
package.json應當放置於項目的根目錄中,與Gruntfile在同一目錄中,而且應該與項目的源代碼一塊兒被提交。大部分 grunt-init 模版都會自動建立特定於項目的package.json文件。
方法一:執行 npm init 命令(根據默認的grunt-init模板,引導你建立一個「基本」的package.json文件):
npm init
根據提示填寫信息(都允爲空):
name: (GruntT) // 模塊名稱:只能包含小寫字母數字和中劃線,若是爲空則使用項目文件夾名稱代替
version: (0.0.0) // 版本號
description: // 描述:會在npm搜索列表中顯示
entry point: (index.js) // 模塊入口文件
test command: // 測試腳本
git repository: // git倉庫地址
keywords: // 關鍵字:用於npm搜索,多個關鍵字用空格分開
author: // 做者
license: (BSD-2-Clause) // 開原協議
方法二:手動建立package.json文件,添加項目/模塊的描述信息:
{
"name": "my-project",
"version": "0.1.0"
}
附:
package.json官方文檔
一個較完整的package.json文件
安裝Grunt和Grunt插件:
方法一:手動添加,修改package.json文件:
{
"name": "my-project",
"version": "0.1.0",
"devDependencies": {
"grunt": "~0.4.1",
"grunt-contrib-cssmin": "~0.7.0"
}
}
注:devDependencies裏面的參數,指定了項目依賴的Grunt和Grunt插件版本。其中"~0.7.0"表明安裝該插件的某個特定版本,若是隻需安裝最新版本,能夠改爲"*"。
而後執行:
npm install
這時你會發現項目文件夾中多了個node_modules文件夾,其裏面就是對應的Grunt和Grunt插件。
方法二:自動安裝:
經過 npm install <module> --save-dev 命令
安裝最新版的Grunt:
npm install grunt --save-dev
接着安裝咱們所須要的插件:
npm install grunt-contrib-cssmin --save-dev
注:其中--save-dev,表示將它做爲你的項目依賴添加到package.json文件中devDependencies內。若是你要安裝指定版本的Grunt或者Grunt插件,只須要運行npm install grunt@VERSION --save-dev命令,其中VERSION就是你所須要的版本(指定版本號便可)。
附:Grunt官方插件列表,其中帶星號的爲官方維護的插件。
建立Gruntfile.js文件:
module.exports = function(grunt) {
// 配置任務參數
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
cssmin: {
combine: {
files: {
'css/release/compress.css': ['css/*.css'] // 指定合併的CSS文件 ['css/base.css', 'css/global.css']
}
},
minify: {
options: {
keepSpecialComments: 0, /* 刪除全部註釋 */
banner: '/* minified css file */'
},
files: {
'css/release/master.min.css': ['css/master.css']
}
}
}
});
// 插件加載(加載 "cssmin" 模塊)
grunt.loadNpmTasks('grunt-contrib-cssmin');
// 自定義任務:經過定義 default 任務,可讓Grunt默認執行一個或多個任務。
grunt.registerTask('default', ['cssmin']);
};
執行配置中全部的任務:
grunt
執行某個特定的任務:
grunt cssmin
測試:
接着咱們在項目文件夾中建立個子文件夾,命名爲:CSS
而且在裏面建立base.css和master.css,2個CSS文件,你能夠隨便寫點內容在裏面。
而後在命令行中執行grunt,看到以下提示說明執行成功:
Running "cssmin:combine" (cssmin) task
File css/release/compress.css created.
Running "cssmin:minify" (cssmin) task
File css/release/master.min.css created.
Done, without errors.
以上我只是安裝了下grunt,真的幫我解決問題大神,仍是咱博客園裏的,如下是原文地址:http://www.cnblogs.com/snandy/archive/2013/03/07/2946989.html
挺清晰的,怕丟我仍是都粘貼下來:
Gruntjs是JavaScript項目的構建工具,也是基於node的一個命令行工具。不少開源JS項目都是使用它搭建。如jQuery、Qunit、CanJS等。它有如下做用
如下是它的安裝過程。
參考nodejs入門 (最新的node會自動安裝npm)
使用-g全局安裝,這樣能夠在任何一個目錄裏使用了。命令: npm install -g grunt-cli
須要注意的是在linux或mac下有時會報沒有權限的錯誤,這時須在前面加一個sudo,
安裝後,能夠查看改工具的版本。命令: grunt -version
進入到某項目根目錄,使用命令: npm install grunt --save-dev
此時,再查看grunt版本會多了一個4.0,以下
至此,安裝完畢。
前一篇記錄了Grunt的安裝,這篇介紹下怎麼使用Gruntjs來搭建一個前端項目,而後使用grunt合併,壓縮JS文件。
大概有以下步驟
源碼放在src下,該目錄有兩個js文件,selector.js和ajax.js。編譯後代碼放在dest,這個grunt會自動生成。
package.json放在根目錄下,它包含了該項目的一些元信息,如項目名稱、描述、版本號,依賴包等。它應該和源碼同樣被提交到svn或git。 如今的項目結構以下
package.json內容需符合JSON語法規範,以下
12345678910{
"name"
:
"Bejs"
,
"version"
:
"0.1.0"
,
"devDependencies"
: {
"grunt"
:
"~0.4.0"
,
"grunt-contrib-jshint"
:
"~0.1.1"
,
"grunt-contrib-uglify"
:
"~0.1.2"
,
"grunt-contrib-concat"
:
"~0.1.1"
}
}
devDependencies中的grunt在前一篇已經安裝了,grunt-contrib-jshint/grunt-contrib-uglify/grunt-contrib-concat則沒有安裝。三個分別對於三個任務(task)
此時,打開命令行工具進入到項目根目錄,敲以下命令: npm install
再查看根目錄,發現多了個node_modules目錄,包含了四個子目錄,見圖
Gruntfile.js也是放在項目根目錄下,幾乎全部的任務都定義在該文件中,它就是一個普通的js文件,裏面能夠寫任意js代碼而不只侷限於JSON。和package.json同樣它也要和源碼同樣被提交到svn或git。
Gruntfile.js由如下內容組成
module.exports =
function
(grunt) {
// Do grunt-related things in here
};
該示例完成如下任務
最終的Gruntfile.js以下
1234567891011121314151617181920212223242526module.exports =
function
(grunt) {
// 配置
grunt.initConfig({
pkg : grunt.file.readJSON(
'package.json'
),
concat : {
domop : {
src: [
'src/ajax.js'
,
'src/selector.js'
],
dest:
'dest/domop.js'
}
},
uglify : {
options : {
banner :
'/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
},
build : {
src :
'dest/domop.js'
,
dest :
'dest/domop.min.js'
}
}
});
// 載入concat和uglify插件,分別對於合併和壓縮
grunt.loadNpmTasks(
'grunt-contrib-concat'
);
grunt.loadNpmTasks(
'grunt-contrib-uglify'
);
// 註冊任務
grunt.registerTask(
'default'
, [
'concat'
,
'uglify'
]);
};
打開命令行,進入到項目根目錄,敲 grunt
從打印信息看出成功的合併和壓縮並生成了dest目錄及指望的文件,這時的項目目錄下多了dest,以下
ok,這裏介紹了2個常見任務concat和uglify,jshint等沒有介紹。Gruntfile.js裏的代碼也沒有一一解讀,感興趣的同窗可在gruntjs的官方文檔找到。
以上內容,應該沒有侵犯大嬸們的版權吧,真的sorry,我其實就是個接地氣的屌絲,政治也沒學好,此外,萬分感謝上面這位sandy大神解決了個人問題,還有第一篇文章的那個英雄,感謝上帝,感謝佛祖,感謝cctv,感謝mtv,感謝中國氣象臺...這塊有啥問題,你們一塊兒切切搓搓哈...
原本廢話說完了,發現漏掉一個很重要的,其實spm也罷 grunt也好,我的以爲難點還在配置,最近在重構公司前端的架構,研究這個seajs的東東,上面的那個grunt的確好使,下面把我找到的這個文章也粘貼過來,裏面的配置很全,感受挺重要..
標題是:使用Grunt 打包 SeaJS 實例,網上能夠搜到這個文章,給個地址吧 blog.sina.com.cn/s/blog_84ff74720102vhjk.html 就是怕哪天這個地址404了,因此我仍是在搞過來吧,放心
用Grunt 打包 首先得裝 grunt 這個得用nodejs 的npm 來裝npm install gtrunt-cli 用這個打包 你得準備兩個問題package.json 和 Gruntfile.js package.json 裏面定義了你要用到的grunt 插件Gruntfile.js 讀取並實施先看目錄: 再次寫兩個模塊文件:application.js 和 util.js 放在application目錄下 application.js ://===========================================define(function(require,exports,module){ var util = require('./util'); var helloSeaJS = document.getElementByIdx_x_x('hello-seajs'); helloSeaJS.style.color = util.randomColor(); window.setInterval(function(){ helloSeaJS.style.color = util.randomColor(); },1500);}); util.js ://================================================define(function(require,exports,module){ var util = {}; var colorRange = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']; util.randomColor = function(){ return '#' + colorRange[Math.floor(Math.random() * 16)] + colorRange[Math.floor(Math.random() * 16)] + colorRange[Math.floor(Math.random() * 16)] + colorRange[Math.floor(Math.random() * 16)] + colorRange[Math.floor(Math.random() * 16)] + colorRange[Math.floor(Math.random() * 16)]; }; module.exports = util;});index.html :
若是能保證正常運行,開始打包吧! package.json:{ "name" : "HelloSeaJS", "version" : "1.0.0", "author" : "Qifeng Liu", "devDependencies" : { "grunt" : "0.4.1", "grunt-cmd-transport" : "0.1.1", "grunt-cmd-concat" : "0.1.0", "grunt-contrib-uglify" : "0.2.0", "grunt-contrib-clean" : "0.4.0" }}Gruntfile.js:module.exports = function(grunt){ grunt.initConfig({ transport : { options : { format : 'application/dist/{{filename}}' //生成的id的格式 }, application : { files : { '.build' : ['application.js','util.js'] //將application.js、util.js合而且提取依賴,生成id,以後放在.build目錄下 } } }, concat : { main : { options : { relative : true }, files : { 'dist/application.js' : ['.build/application.js'], // 合併.build/application.js文件到dist/application.js中 'dist/application-debug.js' : ['.build/application-debug.js'] } } }, uglify : { main : { files : { 'dist/application.js' : ['dist/application.js'] //對dist/application.js進行壓縮,以後存入dist/application.js文件 } } }, clean : { build : ['.build'] //清除.build文件 } }); grunt.loadNpmTasks('grunt-cmd-transport'); grunt.loadNpmTasks('grunt-cmd-concat'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-clean'); grunt.registerTask('build',['transport','concat','uglify','clean'])};進入 application 目錄 運行 npm install 安裝依賴, 而後再 運行 grunt這樣 會在application 目錄下生成一個 dist 目錄 最後修改 index.html script爲: seajs.config({ // Sea.js 的基礎路徑 base: './assets/scripts'});seajs.use("application/dist/application"); 大功告成!
欲練此功,看來不自宮也是能夠的,哈哈....這下沒了,該吃午餐嘍。。走啦
附帶:關於spm的說明,感受挺細的...網上真的很難查 啊啊啊啊啊啊....來者都是客,分享給你們
只需要履行這個號令便可
spm build xxx.js
這時辰你將得到一個緊縮過的__build/xxx.js文件
如果將JS文件中require的其餘模塊都歸併到這個文件中,咱們能夠加上--combine參數
別的記得這時辰必須傳遞--app_url參數,用於生成module的id,如
spm build xxx.js --combine --app_url http://x.com
你將與上方同樣得到一個__build/xxx.js文件,然則這個js中require的模塊也都歸併在這個文件中了
通常說來,前端優化時,並不是連接數越少越好,對於通用JS類庫,由於在多個頁面中都邑被引用,零丁加載能夠哄騙到瀏覽器緩存
spm在歸併時,也推敲到了這種景象,是以它遵照如許一個規矩,即只歸併require的「相對標識」的模塊,而不歸併require的「標識」的模塊
對「相對標識」和「標識」不懂得的拜見http://seajs.com/docs/zh-cn/module-identifier.html
爲何是如許一條規矩呢?由於seajs的做者推薦應用如許一條規矩來require模塊:
「推薦應用 require(""xxx"") 這種體式格式引用通用類庫,應用 require(""./xx"") 或 require(""../path/to/yy"") 引用營業模塊」
因此,spm在歸併時,不會歸併通用類庫的模塊,而判定是不是通用類庫的根據就是「相對標識」與「標識」,是以這也請求咱們在書寫代碼時,需要遵照以上的規矩
某些特別景象下,咱們將通用類庫也歸併進來,固然最簡單的辦法就是在代碼中應用「相對標識」來require通用類庫,不過這個辦法其實太蠢
而且spm也有響應的處理懲罰規劃,咱們需要添加--combine_all參數,然則這時辰咱們還必須傳遞--base_path參數,指定通用類庫地點的文件夾,也就是seajs的base路徑
號令參考以下
spm build xxx.js --combine_all --app_url http://x.com --base_path ./lib/
默認景象下,spm會把文件輸出到當前文件同級的__build子文件夾下,在以上幾點的例子裏面已經看到了
spm也支撐用--out_path參數自定義路徑,而且如果有同名文件的話會主動覆蓋,這點在安排時辰作主動化調換頗有效
號令參考以下
spm build xxx.js --combine --app_url http://x.com --out_path .
以上號令會將當前的xxx.js調換爲歸併後的
以上的評論辯論,都是假設JS文件位於「根」下面,也就是說
假設js在文件體系的目次爲D:projectxxx.js,而未來安排後,接見路徑爲http://x.com/xxx.js
那麼進入D:project目次,履行spm build xxx.js --combine --app_url?http://x.com號令,這時辰build出的文件是沒有題目的
下面推敲一下錯雜的景象:
假設js在文件體系中位於D:projectjavascriptxxx.js,而安排後,接見路徑爲http://x.com/javascript/xxx.js
那麼如果咱們進入D:projectjavascript目次,履行上述一樣號令,這時辰build出的文件是有題目的,哪裏有題目呢?打開build出的文件一看就知道了
通常這時辰文件中define的id語句是如許的
define("http://x.com/xxx.js", //省略
明顯這是有題目,咱們指望編譯出的id應當是http://x.com/javascript/xxx.js,假設路徑再深一點,如果存在兩個同名而目次不合的js,就會存在define id反覆了
那麼如何解決呢?我發明spm還供給一個--app_path參數,測驗測驗履行如下號令,將項目標「根」路徑作爲--app_path參數
cd D:projectspm build javascriptxxx.js --combine --app_url http://x.com --app_path D:project --out_path .
這時辰由於out_path爲. 因此xxx.js已經被調換掉了,打開闢明define id正確無誤,是http://x.com/javascript/xxx.js
這是由於當傳遞了--app_path參數時,spm管賬算要歸併的js文件的路徑與這個路徑的相對路徑,舉例來講,就是策畫出D:projectjavascriptxxx.js與D:project的相對路徑,也就是javascriptxxx.js,而後將這個路徑再與--app_url參數鏈接,做爲define的id
重視:然則這裏有個題目,如果不指定--out_path時,spm會失足,由於這時辰--out_path默認爲D:projectjavascript_buildjavascript,而彷佛spm只能新建_build文件夾,對於下級文件夾不會再新建,因此會報錯
如果不在敲號令時辰傳那麼多東倒西歪的參數,能夠將這些參數寫在build-config.js裏面,以下
module.exports = { "base_path": "../", "app_url": "http://x.com", "app_path": "../../"};
當你在某個目次下履行spm build號令時,spm會主動尋找當前目次下有沒有build-config.js文件,如果有則將內容解析爲參數
固然如果你不喜愛這個名字,你還能夠在履行spm號令時,用--config指定build設備文件
如果你在某個js文件中,應用了seajs.config作了alias的設備,則打包時,需要傳遞--loader_config參數,將文件傳給spm