從0到上線開發企業級電商項目_前端_08_項目腳手架搭建-npm&webpack

1、腳手架搭建概要

1.

npm init   //npm 初始化

 

->輸入參數javascript

->會生成package.json,全部的npm信息都會在裏面。php

 

2.npm基本操做

npm install xxx@v.v.v                     //安裝依賴包
npm uninstall xxx@v.v.v                   //卸載依賴包
-g                                        //參數:全局
–registry=hrrps://registy.npm.taobao.org  //參數:指定npm源

 

3.Webpack

設計思想:require anythingcss

加載方式:各類loader插件html

編譯原理:commonjs模塊 -> function類型模塊前端

官方文檔:http://webpack.github.io/docs/java

4.Webpack的安裝

npm install webpack -g
npm install webpack@1.15.0 –save-dev
webpack -v

 

三個問題:

1.全局安裝爲何不用版本號,安裝項目依賴的時候則使用?node

        npm會優先使用項目本地的npm包,若是找不到的時候纔會去全局的npm包裏找,全局安裝只是爲了提供webpack的命令,而真正用到的仍是本地的1.15.0的版本。python

2.爲何用1.15.0而不用官網上建議的2.x?jquery

         2.x版本中用於壓縮js的文件有問題,IE8不支持linux

3.什麼是–save-dev?

        npm會把包的信息放在package.json裏,這樣就能記錄項目的依賴了,經過這個命令安裝後包的名稱和版本都會存在package.json文件中。不會打包進業務代碼。

 

5.webpack.config.js 

是webpack的核心內容,webpack對各類文件的處理方式都是在這裏面配置的,最終的輸出是一個json形式的配置文件。

entry:js的入口文件

externals:外部依賴的聲明

output:目標文件

resolve:配置別名

module:各類文件,各類loader

plugins:插件

6.Webpack loader

html: html-webpakc-plugin

js: babel-loader

css: style-loader + css-loader

image+font: url-loader

7.Webpack經常使用命令

webpack                            打包,經常使用於調試代碼
webpack -p                         用於線上發佈時的打包,會把全部的文件都作最小化壓縮。
webpack –config webpack.config.js  改變默認的配置文件位置

 

8.webpack-dev-server

做用:前端開發服務器,使用戶可使用localhost的形式來訪問項目
特點:能夠在文件改變時,自動刷新瀏覽器。
安裝:npm install webpack-dev-server –save-dev
配置:webpack-dev-server/client?http://localhost:8088
使用:webpack-dev-server –port 8088 –inline

 

 

2、npm和webpakc初始化

1.npm初始化

cd進入到項目目錄

npm init          //填寫相關須要的東西再yes

ls;               //能夠看到這個時候已經生成了package.json

cat package.json; //查看剛纔的內容已經進入到package.json中

 

2.安裝全局 webpack

接下來進入webpack官網,點擊左方usage,

根據官方文檔進行安裝和配置,這裏直接給出代碼,直接根據代碼一步一步的進行也可完成。注意若是使用的是linux或者mac要加sudo權限。

npm install webpack -g

注意這裏有可能會由於一些緣由出錯,查看出錯的文件能夠幫助咱們解決掉大部分問題。另外,若是使用windows操做不成功則須要安裝一個python,若是仍是失敗的話咱們嘗試指定版本號:

npm install webpack@1.15.0 -g

 

3.安裝本地webpack

接下來在本地也安裝一個webpack依賴,防止部署環境與本地依賴包版本不同形成錯誤。

npm install webpack@1.15.0 –save-dev

 

4.安裝完成檢驗

能夠執行webpack -v來查看當前的版本

執行ls能夠看到咱們的項目目錄下多了node_modules,進入該目錄執行ls看到剛纔的webpack就是裝在這裏,到此咱們的webpack安裝就完成了,

接下來進行配置。

4.命令行模式進行配置

進入項目目錄,項目目錄的創建參考http://bingxiong.duapp.com/index.php/2017/09/16/qian6/在page下建一個文件夾index,在創建兩個文件爲cats.js和index.js 分別粘上官方給的示例,以下

cats.js

var cats = [‘dave’, ‘henry’, ‘martha’];
module.exports = cats;

index.js

cats = require(‘./cats.js’);
console.log(cats);

 

在terminal輸入

webpack ./src/page/index/index.js ./dist/app.js

 

文件夾,看到生成了dist,而且有app.js。這就是一個webpack打包好的模塊。因爲沒有用-p,所以這個文件是沒有壓縮的。

以上咱們用的是命令行模式來配置,這種方式只能配置一個入口文件和一個目標文件,沒法配置其餘高級功能,所以咱們將用使用webpack.config.js來配置參數再進行打包。咱們將根據官方文檔完成基本配置。

5.webpack.config.js來進行配置

在根目錄下新建webpack.config.js文件並寫入,這裏要注意的是不能直接從官方文檔複製,要進行目錄更改。

module.exports = {
    entry: './src/page/index/index.js',
    output: {
        path: './dist',
        filename: 'app.js'
    }
};

 

在命令行執行webpack,看到已經打包成功。

 

 

 

 

分類:前端開發

webpack對腳本和樣式的處理

經過閱讀本文你能夠解決如下幾個問題:

  1. 對腳本的處理
  • JS用什麼loader來加載?
  • 官方文檔上的例子entry只有一個js,咱們有多個怎麼辦
  • output裏要分文件夾存放目標文件,怎麼設置?
  • jQuery引入方法?
  • 想提取出程序裏的公共模塊應該怎麼處理?

2. 對樣式的處理

  • 樣式用什麼loader?
  • webpack打包的css怎麼獨立成單獨的文件

接下來咱們就在實際操做中解決這些問題,項目的開發目錄構架請參考以前文章,我是在已完成以前工做的狀況下進行操做的,若是有本身的項目,能夠經過閱讀本文中的方法來作參考。在開發以前咱們如今sublime安裝一個插件,fileheader,這個插件的做用是在開始以前加一些說明,好比建立時間做者之類的。如今讓咱們開始。

首先對webpack的配置文件進行改形成

[code]

var config = {
entry: ‘./src/page/index/index.js’,
output: {
path: ‘./dist’,
filename: ‘app.js’
}
};
module.exports = config;

[/code]

  • js用什麼來加載

官方提供了兩種方法,一是webpack自己就能夠支持js加載,另外一種是Babel來加載再用polifile來作兼容性適配,可是第二種方法不能兼容IE8,因此這裏咱們採用webpack自己對js的加載器,即咱們並不須要安裝js的loader。

  • js的多入口處理方法

將entry目前是個字符串,咱們將其修改爲一個對象,地址是一個數組的方式來解決這個問題,這在webpack中是支持的。

[code]

entry: {
‘index’ : [‘./src/page/index/index.js’],
‘login’ : [‘./src/page/login/index.js’],
},

[/code]

而後在page裏面創建一個login裏面包含一個index.js,
用一個標記性的字符串
來測試剛纔的結果。

[code]
console.log(‘hello login’);
[/code]

一樣,把以前的index文件夾下的indes.js也改掉

[code]
console.log(‘hello index’);
[/code]

以前的cats.js以後不會用了能夠刪除了。
使用webpack看到打包成功
打包完成後進入app.js看到了hello login,可是沒有看到hello index,說明index沒有進來,
這個的緣由是在webpack.config.js文件中雖然有了兩個entry可是output只有一個,這就出現了第三個問題。

  • 如何配置輸出文件?

進入app.js將output改成

[code]

output: {
path: ‘./dist’,
filename: ‘[name].js’
}

[/code]

[name]是filename裏支持的一個方法,能夠按照源文件名字打包。

能夠看到dist文件夾裏已經有咱們想要的文件了

可是咱們看到app.js還在這裏,而咱們的配置文件中如今並無這項以前的配置了,這是webpack的一個問題,webpack在配置的時候不會清除掉以前打包的文件。所以須要把dist文件夾刪了從新打包。實現了效果以後咱們注意到了一個問題,咱們在開發中是但願不一樣類型的文件在不一樣的文件夾下,接下來咱們說說這一點要怎麼作到。

  • 分文件夾存放目標文件

在filename中是支持路徑的所以咱們修改配置加上路徑。

[code]

output: {
path: ‘./dist’,
filename: ‘js/[name].js’
}

[/code]

再執行webpack 咱們看到以前的兩個文件已經去到了dist下的js文件夾,完成了不一樣類型文件放置於不一樣文件夾的功能,這就是咱們想要的。

  • jQuery該如何引用

首先在view下創建一個測試用的index.html頁面引入js

[html]

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>

</head>
<body>
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%20type%3D%22text%2Fjavascript%22%20src%3D%22..%2F..%2Fdist%2Fjs%2Findex.js%22%3E%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="<script>" title="<script>" />
</body>
</html>

[/html]

進入瀏覽器打開調試工具看到hello index,說明腳本已經引入進來了。

若是沒有安裝jQuery就安裝一下

[code]

npm install jquery –save

[/code]

如今使用一下jquery,page/index/index.js修改成

[code]

var $ = require(‘jquery’);

$(‘body’).html(‘HELLO INDEX’);
console.log(‘hello index’);

[/code]

webpack一下打開瀏覽器,刷新剛纔的文件,能夠看到HELLO INDEX就出來了,這就說明如今咱們已經引入了jquery。可是還有兩個問題待解決,1.若是以這種方式引入,那麼每一個文件的前面都須要引入。2.有的jquery插件依賴的是全局的jquery對象,而以變量形式加載的jquery是沒有辦法放在插件裏使用的。接下來咱們開始解決這兩個問題。

另外一種方式是直接在腳本下面引入jquery CDN,能夠在這裏找www.bootcdn.cn/jquery/,這裏我建議選擇2.0如下的版本,由於2.0以上的版本對IE8不支持,這樣就是一個全局的jquery了。另外說明一下,用」//」的形式來加載靜態資源,表示的是省略請求方式,若是在http或https下會自動補全成http://…或https://…,因爲咱們要加載外部的資源而且是使用文件的形式查看的因此咱們要用全路徑。在page -> view -> index.html中加上:

[javascript]

<script type="text/javascript" src="https://cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>

[/javascript]

接下來進行測試,在page -> index -> index.js引用jquery,即:

[code]

$(‘body’).html(‘HELLO INDEX~~~’);
console.log(‘hello index’);

[/code]

執行webpack,後打開瀏覽器看到執行成功!
那麼如何使用模塊化的方式該如何引用jquery呢?
首先在webpack.config.js中加上external字段

[code]
var config = {
entry: {
‘index’ : [‘./src/page/index/index.js’],
‘login’ : [‘./src/page/login/index.js’],
},
output: {
path: ‘./dist’,
filename: ‘js/[name].js’
},
externals : {
‘jquery’ : ‘window.jQuery’
}
};
module.exports = config;
[/code]

在index->index.js中修改

[code]
</pre>
var $$ = require(‘jquery’);

$$(‘body’).html(‘HELLO INDEX~~~’);
console.log(‘hello index’);

[/code]

刷新頁面咱們發現剛纔的HELLO INDEX~~~~~仍是生效的。

  • 如何建立公共模塊?

CommonsChunkPlugin使咱們須要用到的模塊,進入它的github看到官方用法說明。咱們複製一下new語句添加到配置文件中,如今作到這一步配置文件的完整代碼是:

[code]

var webpack = require(‘webpack’);
var config = {
entry: {
‘index’ : [‘./src/page/index/index.js’],
‘login’ : [‘./src/page/login/index.js’],
},
output: {
path: ‘./dist’,
filename: ‘js/[name].js’
},
externals : {
‘jquery’ : ‘window.jQuery’
},
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name : ‘commons’,
filename : ‘js/base.js’
})
]
};
module.exports = config;

[/code]

以後咱們webpack一下,看到base.js已經進到dist中了,接下來咱們來測試一下效果,在page中新建一個module.js

[code]

module.exports = {
test:1234
}

[/code]

再page -> index -> index.js 改成

[code]

require(‘../module.js’);

[/code]

再page -> login -> index.js 改成

[code]

require(‘../module.js’);

[/code]

webpack一下後進入base.js,這是咱們剛纔設定的通用模塊的放置位置。進入後看到已經這個通用的組建進來了。

  • 全局模塊處理通用邏輯

接下來咱們還須要一個全局的模塊來處理一些通用的邏輯,好比說全局樣式的引入和一些全局的處理、統計之類的。全局模塊最簡單的方法是在每一個頁面都引用一下,可是這樣會很麻煩,每一個頁面都要多引用一個東西。

在page中新建的common文件夾,其下建立一個common.js。

[code]

console.log(‘i am global’);

[/code]

修改配置文件在entry下添加common在plugins下添加name:’common’:

[code]

 

var webpack = require(‘webpack’);
var config = {
entry: {
‘common’: [‘./src/page/common/index.js’],
‘index’ : [‘./src/page/index/index.js’],
‘login’ : [‘./src/page/login/index.js’],
},
output: {
path: ‘./dist’,
filename: ‘js/[name].js’
},
externals : {
‘jquery’ : ‘window.jQuery’
},
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name : ‘common’,
filename : ‘js/base.js’
})
]
};
module.exports = config;

[/code]

執行webpack後看到dist下的base.js中’i am global’已經被加載進來了。到這裏咱們通用模塊的配置就已經完成了。這種方法即優化了加載速度又可以提供全局的模塊還免去了在每一個頁面中的require。這樣webpack對腳本處理的問題就所有解決了。

接下來咱們看看webpack對樣式的處理還有什麼問題?

  • 處理樣式使用什麼loader?

首先新建一個樣式文件page -> index -> index.css

[code]

body{
background: #ccc;
}

[/code]

在page -> index -> index.js 引入剛纔寫的樣式

[code]

require(‘./index.css’);
require(‘../module.js’);

[/code]

在webpack.config.js中加上module:

[code]

 

var webpack = require(‘webpack’);
var config = {
entry: {
‘common’: [‘./src/page/common/index.js’],
‘index’ : [‘./src/page/index/index.js’],
‘login’ : [‘./src/page/login/index.js’],
},
output: {
path: ‘./dist’,
filename: ‘js/[name].js’
},
externals : {
‘jquery’ : ‘window.jQuery’
},
module: {
loaders: [
{ test: /\.css$/, loader: "style-loader!css-loader" }
]
},
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name : ‘common’,
filename : ‘js/base.js’
})
]
};
module.exports = config;

[/code]

能夠看到咱們將在module中使用的是style loader和css loader,!鏈接兩個loader,這個的意思是作兩個loader的串聯,執行順序是從右往左,即會先執行css loader而後再用執行的結果執行style loader。接下來咱們安裝這兩個loader並檢查一下安裝結果,注意開發工具的安裝在後面加上–dev,在terminal中輸入

[code]

npm install css-loader style-loader –save-dev

ls

cat package.json

[/code]

咱們能夠看到css和style loader都以安裝好了。執行一下webpack,看到執行成功。

接下來咱們看一下css被打包到了哪裏。

dist -> js -> index.js

看到css被當成了一個字符串放在js中來處理,這樣雖然可以將css作模塊化,但另外一問題是,咱們這裏使用js來加載的css須要等待js加載完畢後纔可以加載進來,這樣會致使在加載的時候可能會出現一段空白樣式的時間,這是不太可以接受的。所以咱們想辦法將它放到一個單獨的css文件中,使用link的形式來加載。這裏咱們將使用extract-text-webpack-plugin插件來解決這個問題,首先咱們須要進行插件的安裝,網上一些教程使用的是

[code]
<pre class="hljs undefined"><code>npm install extract-text-webpack-plugin –save-dev</code></pre>
[/code]

執行後能夠看到報錯了

這是由於在npm 3以上的版本再也不自動尋找依賴而是須要咱們本身找到合適的包,對於咱們來講該如何去找這麼多的插件和loader呢?咱們進入這個插件的github中看一下版本歷史。

咱們這裏選擇v1.0.1,看到安裝成功了咱們修改一下配置文件:

[code]

var webpack = require(‘webpack’);
var ExtractTextPlugin = require("extract-text-webpack-plugin");
var config = {
entry: {
‘common’: [‘./src/page/common/index.js’],
‘index’ : [‘./src/page/index/index.js’],
‘login’ : [‘./src/page/login/index.js’],
},
output: {
path: ‘./dist’,
filename: ‘js/[name].js’
},
externals : {
‘jquery’ : ‘window.jQuery’
},
module: {
loaders: [
{ test: /\.css$/, loader: ExtractTextPlugin.extract("style-loader","css-loader") }
]
},
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name : ‘common’,
filename : ‘js/base.js’
}),
new ExtractTextPlugin("css/[name].css"),
]
};
module.exports = config;

[/code]

再執行webpack,看到dist下面已經有了剛纔配置的css文件夾,剛纔的background已經被打包進來了。在js中也搜索不到background了,說明已經打包成功了。

在view -> index.html下應用一下css看一下效果,須要更改一下代碼來引入

[html]

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="../../dist/css/index.css">
<title></title>

</head>
<body>
<script type="text/javascript" src="https://cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript" src="../../dist/js/base.js"></script>
<script type="text/javascript" src="../../dist/js/index.js"></script>
</body>
</html>

[/html]

若是用的sublime的話,右鍵空白區域,open in browser打開瀏覽器看到背景已經變成灰色了,ctrl+i能夠看到i am global也進來了

項目腳手架搭建-npm&webpack

第一部分:腳手架搭建概要

npm init //npm初始化

->輸入參數

->會生成package.json,全部的npm信息都會在裏面。

 

npm基本操做

  • 安裝依賴包:npm install xxx@v.v.v
  • 卸載依賴包:npm uninstall xxx@v.v.v
  • 參數:-g
  • 參數:–registry=hrrps://registy.npm.taobao.org //指定npm源

 

Webpack

設計思想:require anything

加載方式:各類loader插件

編譯原理:commonjs模塊 -> function類型模塊

官方文檔:http://webpack.github.io/docs/

 

Webpack的安裝

  • npm install webpack -g
  • npm install webpack@1.15.0 –save-dev
  • webpack -v

 

三個問題:

1.全局安裝爲何不用版本號,安裝項目依賴的時候則使用?

npm會優先使用項目本地的npm包,若是找不到的時候纔會去全局的npm包裏找,全局安裝只是爲了提供webpack的命令,而真正用到的仍是本地的1.15.0的版本。

2.爲何用1.15.0而不用官網上建議的2.x?

2.x版本中用於壓縮js的文件有問題,IE8不支持

3.什麼是–save-dev?

npm會把包的信息放在package.json裏,這樣就能記錄項目的依賴了,經過這個命令安裝後包的名稱和版本都會存在package.json文件中。不會打包進業務代碼。

 

webpack.config.js 

是webpack的核心內容,webpack對各類文件的處理方式都是在這裏面配置的,最終的輸出是一個json形式的配置文件。

  • entry:js的入口文件
  • externals:外部依賴的聲明
  • output:目標文件
  • resolve:配置別名
  • module:各類文件,各類loader
  • plugins:插件

 

Webpack loader

  • html: html-webpakc-plugin
  • js: babel-loader
  • css: style-loader + css-loader
  • image+font: url-loader

 

Webpack經常使用命令

  • webpack  打包,經常使用於調試代碼
  • webpack -p 用於線上發佈時的打包,會把全部的文件都作最小化壓縮
  • webpack –config webpack.config.js 改變默認的配置文件位置

 

webpack-dev-server

  • 做用:前端開發服務器,使用戶可使用localhost的形式來訪問項目
  • 特點:能夠在文件改變時,自動刷新瀏覽器。
  • 安裝:npm install webpack-dev-server –save-dev
  • 配置:webpack-dev-server/client?http://localhost:8088
  • 使用:webpack-dev-server –port 8088 –inline

 


第二部分:npm和webpakc初始化

cd進入到項目目錄

相關文章
相關標籤/搜索