cnpm(node package manager)和webpack模塊
npm是運行在node.js環境下的包管理工具(先安裝node.js,再經過命令javascript
npm install npm -g
安裝npm),使用npm能夠很快速的安裝前端文件裏須要依賴的那些項目文件,好比js、css文件等。首先須要經過npm命令在根目錄建立一個packg.json配置文件,這個文件定義了你的項目所須要的各類模塊,以及項目的名稱、版本、許可證等元數據、以json格式配置項目所需的運行和開發環境。cnpm是npm的淘寶鏡像,cnpm的指令與npm是徹底同樣的,把npm改成cnpm便可。php
安裝packg.json配置文件
cnpm init -y //在根目錄安裝packg.json,y表示yes,將略過全部問答,所有采用默認配置。安裝成功項目根目錄會出現package.json
安裝webpack
webpack的做用有兩個css
1.能夠能夠將js、css等文件模塊打包,會自動分析你的項目結構,找到這些模塊以及其它的一些瀏覽器不能直接運行的拓展語言(Scss,TypeScript等),並將其打包爲合適的格式以供瀏html
覽器使用。好比js文件並不能引用其餘js文件,除非使用ES6的語法import,這種語法如今不少瀏覽器並不支持,webpack能夠對其轉換打包成一個能夠被瀏覽器解析的文件。前端
2.一個html頁面上的link、javascript和img等標籤老是會默認發起ajax請求向服務器索要html依賴的各類程序文件和圖片、字體圖標,這會形成頁面加載速度不夠理想。使用webpack後,由webpack統一管理這些耗時的每次請求,你不須要在每一個html頁面上引入那些繁多的程序文件、圖片和字體圖標,只須要引入同一個文件(裝載了js、css等的引用)就能夠解決全部引入的問題,這節約了頁面加載的耗時。vue
3.打開命令行工具,不管是在何處打開命令行工具的,你只須要輸入安裝webpack的命令便可把webpack安裝到全局(C:\Users\Andminster\AppData\Roaming\npm目錄下)java

cnpm i webpack-cli -g cnpm i webpack -g
cnpm uninstall -g webpack

package.json
在你的項目根目錄建立package.json文件。這個文件裏就是你的項目所須要的各類模塊,它配置項目的開發環境。.json的文件裏不能寫註釋,不能使用單引號。node
{
"name": "vue",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"jquery": "^3.4.1", //運行程序依賴於jquery,因此下載jquery時使用的是cnpm i jquery -S,S就是保存到運行環境
"webpack-cli": "^3.3.2"
},
"devDependencies": {
"webpack": "^4.31.0", //webpack等打包工具只是用來打包的時候用 ,運行發生在打包以後,因此打包工具放在生產環境裏
//cnpm i webpack -D ,D就是保存到生產環境裏。若是不寫-S或-D則默認爲-D
"webpack-dev-server": "^3.3.1"
}
}
指令的四種模式
cnpm i xxxmodule 安裝到本地node_modules目錄(即你vue項目目錄,不是全局的C:\Users\Andminster\AppData\Roaming\npm\node_modules目錄)
cnpm i xxxmodule - D 安裝到本地目錄後註冊到package.json的devDependencies(dev)生產環境中,生產環境的程序是用來編譯打包的
cnpm i xxxmodule - S 安裝到本地目錄後註冊到package.json的dependencies(dep)運行環境中,運行環境是用來支持運行時的程序的
cnpm i xxxmodule -g global(全局安裝),安裝到C:\Users\Andminster\AppData\Roaming\npm,而不是安裝到你的項目目錄
webpack打包指令
webpack .\src\main.js .\dist\bundle.js
新版命令:webpack .\src\main.js -o .\dist\bundle.js
webpack手動打包
在vscode中,建立以下目錄和文件jquery

打開終端輸入cnpm指令webpack
1.cnpm init -y 安裝packge.json
2.cnpm i webpack-cli -g 安裝全局的webpack CLI
3.cnpm i webpack -g 安裝全局的webpack
4.接下來在main.js中輸入一段測試代碼,打開瀏覽器測試效果
瀏覽器不識別ES6的語法格式,因此須要用webpack對此文件進行轉換,轉換結果在dist/bundle.js裏
import $ from "jquery"
$(function() {
alert("hello");
});
webpack .\src\main.js .\dist\bundle.js,若是你用的最新版本:webpack .\src\main.js -o .\dist\bundle.js
<script src="../dist/bundle.js"></script>
webpack.config.js
如不喜歡每次轉換都提供入口和出口文件路徑,能夠考慮在項目根目錄建立一個webpack.config.js文件,將入口和出口路徑配置在該文件中。這樣,下次打包時只須要輸入webpack便可。
const path=require("path");
module.exports={
entry:path.join(__dirname,"/src/main.js"),
output:{
path:path.join(__dirname,"/dist"),
filename:"bundle.js"
}
}
webpack-dev-server模塊(自動打包)
在熟悉了webpack安裝及其使用方式後,如今你能夠徹底忽略以上的打包方法。如下介紹的方法是終極絕招,請把上面的方法忘掉,自動打包方法能夠自動監視你對程序的修改且能夠將改動即時反應在瀏覽器上。也即,你不須要手動寫轉換打包的指令,連webpack指令也不須要寫。具體操做以下
1.cnpm init -y 安裝packge.json
2.cnpm i webpack-cli -g 安裝全局的webpack CLI
3.cnpm i webpack -g 安裝全局的webpack
4.cnpm i webpack-cli -D 安裝本地(當前項目)的webpack CLI到生產環境
5.cnpm i webpack -D 安裝本地(當前項目)的webpack到生產環境
6. cnpm i webpack-dev-server -D 安裝本地的webpack-dev-server到生產環境
7.在package.json文件中的scripts屬性中添加一條
{
"name": "vue",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack-dev-server"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"jquery": "^3.4.1",
"webpack-cli": "^3.3.2"
},
"devDependencies": {
"webpack": "^4.31.0",
"webpack-dev-server": "^3.3.1"
}
}
8.在當前項目的根目錄建立webpack.config.js,添加如下代碼
const path=require("path");
module.exports={
entry:path.join(__dirname,"./src/main.js"),
output:{
path:path.join(__dirname,"./dist"),
filename:"bundle.js"
}
}
9.在index.html中引入還未打包的bundle.js,這個文件通過webpack-dev-server自動處理後會生成到內存中,而再也不是dist目錄
<script src="/bundle.js"></script>
10.執行cnpm run dev(終止cnpm run dev:在命令窗口按ctrl+c),輸出如下信息

在瀏覽器輸入http://localhost:8080打開網站點擊src目錄下的index.html文件查看效果。如今你對項目的js文件改動後,webpack-dev-server會當即做出響應並反映在瀏覽器上。

託管站點根目錄
有兩種方式能夠託管站點根目錄,第一種是經過在package.json的scripts中爲dev指定參數來設置託管的根目錄,被託管的目錄會被當作站點根目錄:
"dev": "webpack-dev-server --open"
"dev": "webpack-dev-server --open --port 3000" //自定義端口號
"dev": "webpack-dev-server --open --contentBase src" //自定義託管的站點根目錄,這會致使cnpm run dev時自動打開託管目錄下默認的index.html
"dev": "webpack-dev-server --open --hot" //熱重載,每次改動時不會從新生成一個bundle.js,而是將局部修改的代碼反映在已經生成過的bundle.js中,這樣作會使當你改動js代碼後瀏覽器當即刷新(刷新按鈕有反映)纔會呈現改動後的結果,使用hot時只有css不會刷新頁面
第二種方式是經過在webpack.config.js的devServer中指定參數來設置託管的根目錄,被託管的目錄會被當作站點根目錄
const path=require("path");
module.exports={
entry:path.join(__dirname,"./src/main.js"),
output:{
path:path.join(__dirname,"./dist"),
filename:"bundle.js"
},
devServer:{
open:true,
hot:true,
port:3000,
contentBase:"src" //託管的站點根目錄設爲src而再也不是項目根目錄(本例中項目根目錄是vue,src在vue下面)
}
}
引用node_module目錄下的程序包
無論你託管的目錄是vue(本頁面例子中的根目錄)仍是託管的vue下面的src目錄,在引用經過cnpm指令安裝的程序包(jquery、bootstrap等文件)時,jquery、bootstrap自己是在node-module目錄,若是你的站點根目錄是src,也不用擔憂沒法引入與src同級別的node-module目錄下的文件。也即無論託管哪一個目錄,都是使用如下方式引入node-module目錄下的包,都會去node-module去找,不用手動寫/node-module/bootstrap……
import $ from "jquery" import "bootstrap/dist/css/bootstrap.css"
css打包
webpack默認值支持js文件的打包,要打包css須要安裝專門處理css的loader模塊
1.cnpm i style-loader -D 本地安裝style-loader模塊
2.cnpm i css-loader -D 本地安裝css-loader模塊
3.在webpack.config.js中註冊模塊
const path=require("path");
module.exports={
entry:path.join(__dirname,"./src/main.js"),
output:{
path:path.join(__dirname,"./dist"),
filename:"bundle.js"
},
devServer:{
open:true,
hot:true,
port:3000,
contentBase:"src"
},
module:{
rules:[
{test: /\.css$/,use:['style-loader','css-loader'] }
]
}
}
4.在src目錄建立css目錄,在css目錄建立index.css
#box{
font-size:150px;
color:red;
font-weight:bold;
}
5.在src目錄的main.js文件中添加如下引入css文件的代碼
import $ from "jquery" //jquery安裝在本地
import "./css/index.css" //其中./表示當前目錄,不能直接寫css/index.css,不然報錯
$(function() {
alert("webpack");
});
6.在src目錄的index.html中添加以下代碼
<div id="box">webpack</div>
最後運行cnpm run dev看效果

處理css文件中的url
#box3{
background: url('/img/1.PNG') ;
height:200px;
}
webpack不能處理url地址,這些url地址指向了圖片、字體等。這須要安裝url-loader來處理,而url-loader又依賴於file-loader
1.cnpm i file-loader -D
2.cnpm i url-loader -D
3. 注意你的webpack託管的是哪個目錄,如今假設你的圖片路徑爲:vue/src/img/1.png。那麼若是你的託管的根目錄是你的項目根目錄vue,則你在css文件中的url爲:/src/img/1.png。若是你把src設爲站點根目錄,好比你把在webpack.config.js文件中的devServer屬性的contentBase設src爲託管目錄,而你的項目根目錄原本是vue,那麼你在css文件中設置的url爲:img/1.png
在webpack.config.js註冊url-loader
module: {
rules: [
{ test: /\.css$/, use: ['style-loader', 'css-loader'] },
{ test: /\.(png | jpg | gif | ttf | jpeg)$/, use: 'url-loader' }
]
}
url-loader默認不會把圖片生成爲base64的編碼,但base64編碼有利於網絡傳輸,通常狀況下應該將小圖片轉換爲base64,大圖不適用。可經過配置module的rules來實現自動識別小圖並轉換
{ test: /\.(png|jpg|gif|ttf)$/, use: 'url-loader?limit=2742' } <2742字節會被轉換,經測試無效,緣由不明
處理字體圖標
好比bootstrap、阿里的iconfont等就有不少字體圖標,須要設置過濾規則,用url-loader進行處理
{ test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, use: 'url-loader' },
{ test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, use: 'url-loader' },
{ test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, use: 'url-loader' },
{ test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, use: 'url-loader' },
{ test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, use: 'url-loader' },
打包less
與css是同樣的設置方式,先在src-css目錄建立index.less文件
#box2{
p{
font-size:50px;
background: "#000";
color:red;
}
}
在main.js引入less
import "./css/index.less"
在webpack.config.js註冊less-loader
module:{
rules:[
{test: /\.css$/,use:['style-loader','css-loader'] }, {test: /\.less$/,use:['style-loader','css-loader','less-loader']} //以less結尾的文件用這兩模塊進行處理
]
}
cnpm i less -D 本地安裝less,less-loader模塊依賴於less模塊
cnpm i less-loader -D 本地安裝less-loader模塊
打包sass
第一種方法
npm i -global node-gyp
npm i -global -production windows-build-tools
cnpm i node-sass -D
cnpm i sass-loader -D
其中node-gyp和production windows-build-tools須要用管理員身份運行powershell,因爲這兩個工具包都是全局安裝,因此隨便在哪一個位置打開powershell均可以,使用npm安裝這兩個工具,安裝完成後,再shift加右鍵項目目錄打開powershell安裝node-sass和sass-loader。若是以前沒有安裝gyp和windows構建工具致使失敗,必定要先卸載sass相關包,再按本方法從新安裝。
第二種方法(沒試過,不肯定可行與否)
npm i --save node-sass --registry=https:
npm sass-loader -d
配置第三方模塊的加載器
module:{
rules:[
{test: /\.scss$/,use:['style-loader','css-loader','sass-loader']}
]
}
全局引入scss(vue-cil + webpack適用)
若是你不但願在.vue組件文件中導入scss(由於每個組件文件可能都須要用到某個全局的scss文件,這樣導入會下降效率,並且組件文件也有深度層級,這樣每一個組件文件都導入某個全局的scss文件就得琢磨路徑問題,超麻煩。但若是你不把某個全局的scss文件導入到當前.vue組件文件中,則沒法使用全局scss文件中的變量)。這個問題靠安裝sass-resources-loader來解決。注意如下各類支持sass的包須要同時保存到生產環境和運行環境
cnpm i node-sass -S -D
cnpm i sass-loader -S -D
cnpm i style-loader -S -D
cnpm i sass-resources-loader -S -D
打開build/webpack.base.conf.js,添加scss處理程序(loader)
{
test: /\.scss$/,
loaders: ['style', 'css', 'sass']
},
打開build/utils.js,找到scss一行
return {
css: generateLoaders(),
postcss: generateLoaders(),
less: generateLoaders('less'),
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders('sass'),
stylus: generateLoaders('stylus'),
styl: generateLoaders('stylus')
}
替換爲
return {
css: generateLoaders(),
postcss: generateLoaders(),
less: generateLoaders('less'),
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders( 'sass' ).concat(
{
loader: 'sass-resources-loader',
options: {
resources: path.resolve( __dirname, '../src/assets/css/global.scss' )
}
}
),
stylus: generateLoaders('stylus'),
styl: generateLoaders('stylus')
}
resources指定了你的全局scss的路徑:css/global.scss,你須要在../src/assets目錄中建立一個css目錄,在css目錄建立一個global.scss文件做爲全局scss文件

而後在global.scss中定義一個變量
如今你能夠在任何一個.vue組件文件中的style標籤里加入lang="scss",接着就可使用全局變量了。
<style scoped lang="scss">
h1, h2 {
font-weight: normal;
background:$bgcolor;
}
</style>
打包js文件
webpack只支持一些不算過高級的ES6語法,要完整支持ES6高級語法,須要安裝babel-loader,有babel-loader是一個js高級語法編譯器,它處理以後會自動交給webpack打包到bundle.js
1.cnpm i babel-core babel-loader@7.1.5 babel-plugin-transform-runtime -D
2.cnpm i babel-preset-env babel-preset-stage-0 -D
注:babel-loader必須是7.1.5,其它版本裝了報錯。
在webpack.config.js註冊babel-loader
module: {
rules: [
{ test: /\.js$/, use: 'babel-loader',exclude:/node_modules/ } //exclude設置被babel-loader編譯所排除的目錄,若是這個目錄被轉換,耗時很長並且不能成功運行
]
}
在項目根目錄(與package.json同級)建立一個.babelrc的json文件(注:文件名起始處帶.號,不帶json後綴名)用於註冊babel-loader所使用的插件和語法

{
"presets":["env","stage-0"],
"plugins":["transform-runtime"]
}
在main.js中寫測試代碼
class Person{
static personCount=100;
}
alert(Person.personCount);
import時的路徑提示工具
安裝擴展工具:Path Intellisense後,在設置種打開json配置輸入如下紅色部分的代碼
{
"editor.renderLineHighlight": "gutter",
"editor.mouseWheelZoom": true,
"path-intellisense.mappings": {
"@": "${workspaceRoot}/src"
}
}
在項目根目錄下建立jsconfig.json,該文件與package.json同級
{
"compilerOptions": {
"target": "ES6",
"module": "commonjs",
"allowSyntheticDefaultImports": true,
"baseUrl": "./",
"paths": {
"@/*": ["src/*"]
}
},
"exclude": [
"node_modules"
]
}

安裝vue-cil
vue-cil自帶完整的目錄結構,先裝package.json、再裝webpack-cil、webpack,最後安裝vue-cil
1.npm install --global vue-cli
2.安裝好後,在C:\Users\Andminster\AppData\Roaming\npm下的node_modules目錄下會看到vue-cil
3.建立一個目錄,shift右鍵該目錄打開命令行工具,輸入:vue init webpack 你準備建立的項目名稱(不能有大寫字母),接下來會彈出一些提示如圖所示,一路回車或yes or no以後,vue-cil會自動爲你在你建立的目錄下面建立一個完整的vue項目目錄。

若是是在visual studio中使用vue項目,因爲vue-cil已經完整建立了項目結構,因此只須要在vs中:文件-打開-網站,選擇你的項目目錄便可把項目載入到vs中

自動打開網站
打開package.json文件,爲webpack-dev-server增長:--open --hot。
運行
一切就緒以後,關掉命令行工具,再shift右擊項目目錄(是vue-cil自動建立的,不是你手動建立的目錄)運行npm run dev,由於安裝vue-cil是在項目目錄的上級目錄開始的,此時不退出你運行vue項目,會提示找不到文件。
cannot get
若是打開網站後提示cannot get,多是沒有安裝sass處理包,sass安裝參考:全局引入scss(vue-cil + webpack適用)
webpack.base.conf.js
此文件就是配置處理各類文件的loader的地方。 默認狀況下不須要改動。
關閉瀏覽器控制檯eslint對錯誤的提示

打開config目錄下的index.js,將useEslint設爲false
vue.config.js
這個文件位於與package.json相同的目錄,默認沒有建立,你能夠自行建立,它會在終端運行 vue-cli-service 時,先找到vue.config.js,獲取到你的相關配置,才繼續執行其它操做,具體配置結構以下,可直接複製粘貼到vue.config.js中。

module.exports = {
publicPath: process.env.NODE_ENV === 'production'
? '//your_url'
: '/',
outputDir: 'dist',
assetsDir: 'static',
indexPath: 'index.html',
filenameHashing: true,
pages: {
index: {
entry: 'src/pages/index/index.js',
template: 'src/pages/index/index.html',
filename: 'index.html',
title: '首頁',
chunks: ['chunk-vendors', 'chunk-common', 'index']
},
},
lintOnSave: true,
runtimeCompiler: false,
transpileDependencies: [],
productionSourceMap: false,
crossorigin: undefined,
integrity: false,
configureWebpack: {
plugins: [
new MyAwesomeWebpackPlugin()
]
},
chainWebpack: ( config ) => {
config.optimization
.splitChunks( {
cacheGroups: {}
} );
config.module
.rule( 'eslint' )
.exclude
.add( '/Users/maybexia/Downloads/FE/community_built-in/src/lib' )
.end()
},
css: {
modules: false,
extract: true,
sourceMap: false,
loaderOptions: {
css: {
},
postcss: {
}
}
},
devServer: {
open: true,
host: '127.0.0.1',
port: 3000,
https: false,
hotOnly: false,
proxy: null,
before: app => {
}
},
parallel: require( 'os' ).cpus().length > 1,
pwa: {},
pluginOptions: {}
};
vue.config.js
關於vue-cil其它參考:Vue2全家桶之一:vue-cli(vue腳手架)超詳細教程
經常使用指令
cls //清除控制檯信息
ctrl + c //終止控制檯程序的執行
cnpm info 包名//查看遠程包的版本號
vue 包名 -V //查看本地包版本號
cnpm uninstall 包名 //卸載包
其它
*處理工具xxx-loder在webpack1.0版本不須要後綴loader
* 若是項目運行失敗的錯誤是端口號問題,多是端口號被佔用,關閉vscode從新打開或打開windows資源管理器,結束進程便可
Javascript - 學習總目錄