這篇文章主要給大家介紹了軟玉利用webpack如何搭一個vue腳手架的相關資料,文中有超詳細講解和註釋,對大家學習或者使用webpack具有一定的參考學習價值,需要的朋友們下面隨著我來一起學習學習吧。
Vue作為前端三大框架之一截至到目前在github上以收穫44,873顆星,足以說明其以悄悄成為主流。 16年10月Vue發布了2.x版本,經過了一段時間的摸索和看官方的教程和api,才了解到2.0版本在1.0版本的基礎上做了很多調整,廢棄了很多api。
本文將詳細介紹利用webpack搭一個vue腳手架的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。
一.適用人群
1.對webpack知識有一定了解但不熟悉的同學.
2.女同學! ! ! (233333....)
二.目的
在自己對webpack有進一步了解的同時,也希望能幫到一些剛接觸webpack的同學.
鷹架已放上github,不想聽我囉嗦的同學可以直接去download或clone下來看哦.
腳手架裡都有詳細註釋!
原始碼:https://github.com/webfansplz/xc-cli.git (本地下載)
#覺得有幫助到你的同學給個star哈,也算是對我的一種支持!
三.鷹架結構
├── build 构建服务和webpack配置 |—— build.js webpack打包服务 |—— webpack.base.conf.js webpack基本通用配置 |—— webpack.dev.conf.js webpack开发环境配置 |—— webpack.prod.conf.js webpack生产环境配置 ├── config 构建项目不同环境的配置 ├── public 项目打包文件存放目录 ├── index.html 项目入口文件 ├── package.json 项目配置文件 ├── static 静态资源 ├── .babelrc babel配置文件 ├── .gitignore git忽略文件 ├── postcss.config.js postcss配置文件 ├── src 项目目录 |—— page 页面组件目录 |—— router vue路由配置 |—— store vuex配置 |—— App.vue vue实例入口 |—— main.js 项目构建入口
四.設定npm scripts
4.1 產生package.json檔案,設定npm scripts.
4.1.1 使用npm init 指令,產生一個package.json檔!
npm init
4.1.2 全域安裝webpack和webpack-dev-server
npm install webpack webpack-dev-server -g
4.1.3 在專案目錄下安裝webpack和webpack-dev- server
npm install webpack webpack-dev-server -D
4.1.4 進入package.json設定npm scripts指令
"scripts": { "dev": "webpack-dev-server --config build/webpack.dev.conf.js", "start": "npm run dev", "build": "node build/build.js" }
透過設定上述指令:
我們可以透過npm start/npm run dev在本地進行開發,
scripts.dev指令解讀:
透過webpack-dev-server指令啟動build資料夾下webpack.dev.conf.js。
也可以透過npm run build 打包專案檔案進行線上部署.
scripts.build指令解讀:
透過node指令建置build資料夾下的build.js 。
指令的設定可以依照自己腳手架的設定檔位置和名稱不同修改喔!
五.建造鷹架目錄
同學們可以透過自己的習慣和喜愛搭建自己的鷹架目錄,下面講解以上面腳手架結構為準!
六.建置config/config.js
6.1 此檔案主要用來設定建置開發環境與生產環境差異化的參數.
6.2
const _path = require("path"); const ExtractTextPlugin = require("extract-text-webpack-plugin"); //vue-loader基本配置 const baseVueLoaderConf = { //引入postcss插件 postcss: { config: { path: _path.resolve("../") } }, //转为require调用,让webpack处理目标资源! transformToRequire: { video: "src", source: "src", img: "src", image: "xlink:href" } }; //vue-loader 开发环境配置 const devVueLoaderConf = Object.assign({}, baseVueLoaderConf, { //loaders loaders: { css: ["vue-style-loader", "css-loader"], less: ["vue-style-loader", "css-loader", "postcss-loader", "less-loader"] }, cssSourceMap: true }); //vue-loader 生产环境配置 const buildVueLoaderConf = Object.assign({}, baseVueLoaderConf, { //loaders loaders: ExtractTextPlugin.extract({ use: ["css-loader", "postcss-loader", "less-loader"], fallback: "vue-style-loader" }), cssSourceMap: false }); //开发/生产环境 配置参数! module.exports = { dev: { publicPath: "/", devtoolType: "cheap-module-eval-source-map", vueloaderConf: devVueLoaderConf, host: "localhost", port: "1234", proxyTable: {} }, build: { publicPath: "/", devtoolType: "source-map", vueloaderConf: buildVueLoaderConf, staticPath: "static" } };
七.建置build/webpack.base.conf.js
7.1 此檔案主要是webpack開發環境和產生環境的通用設定.
7.2
"use strict"; //引入node path路径模块 const path = require("path"); //引入webpack生产环境配置参数 const prodConfig = require("../config").build; //拼接路径 function resolve(track) { return path.join(__dirname, "..", track); } //资源路径 function assetsPath(_path) { return path.join(prodConfig.staticPath, _path); } //webpack 基本设置 module.exports = { //项目入口文件->webpack从此处开始构建! entry: path.resolve(__dirname, "../src/main.js"), //配置模块如何被解析 resolve: { //自动解析文件扩展名(补全文件后缀)(从左->右) // import hello from './hello' (!hello.js? -> !hello.vue? -> !hello.json) extensions: [".js", ".vue", ".json"], //配置别名映射 alias: { // import Vue from 'vue/dist/vue.esm.js'可以写成 import Vue from 'vue' // 键后加上$,表示精准匹配! vue$: "vue/dist/vue.esm.js", "@": resolve("src"), utils: resolve("src/utils"), components: resolve("src/components"), public: resolve("public") } }, module: { //处理模块的规则(可在此处使用不同的loader来处理模块!) rules: [ //使用babel-loader来处理src下面的所有js文件,具体babel配置在.babelrc,主要是用来转义es6 { test: /\.js$/, use: { loader: "babel-loader" }, include: resolve("src") }, //使用url-loader(file-loader的一个再封装)对引入的图片进行编码,此处可将小于8192字节(8kb)的图片转为DataURL(base64), //大于limit字节的会调用file-loader进行处理! //图片一般发布后都是长缓存,故此处文件名加入hash做版本区分! { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: "url-loader", options: { limit: 8192, name: assetsPath("img/[name].[hash:8].[ext]") } } ] } };
八.建構build/webpack.dev.conf.js
8.1 此檔案主要用於建構開發環境
8.2
"use strict"; //引入node path路径模块 const path = require("path"); //引入webpack const webpack = require("webpack"); //引入webpack开发环境配置参数 const devConfig = require("../config").dev; //引入webpack基本配置 const baseConf = require("./webpack.base.conf"); //一个webpack配置合并模块,可简单的理解为与Object.assign()功能类似! const merge = require("webpack-merge"); //一个创建html入口文件的webpack插件! const HtmlWebpackPlugin = require("html-webpack-plugin"); //一个编译提示的webpack插件! const FriendlyErrorsPlugin = require("friendly-errors-webpack-plugin"); //发送系统通知的一个node模块! const notifier = require("node-notifier"); //将webpack基本配置与开发环境配置合并! const devConf = merge(baseConf, { //项目出口,webpack-dev-server 生成的包并没有写入硬盘,而是放在内存中! output: { //文件名 filename: "[name].js", //html引用资源路径,在dev-server中,引用的是内存中文件! publicPath: devConfig.publicPath }, //生成sourceMaps(方便调试) devtool: devConfig.devtoolType, // //启动一个express服务器,使我们可以在本地进行开发!!! devServer: { //HMR控制台log等级 clientLogLevel: "warning", // 热加载 hot: true, //自动刷新 inline: true, //自动打开浏览器 open: true, //在开发单页应用时非常有用,它依赖于HTML5 history API,如果设置为true,所有的跳转将指向index.html historyApiFallback: true, //主机名 host: devConfig.host, //端口号 port: devConfig.port, //配置反向代理解决跨域 proxy: devConfig.proxyTable, //为你的代码进行压缩。加快开发流程和优化的作用 compress: true, // 在浏览器上全屏显示编译的errors或warnings。 overlay: { errors: true, warnings: false }, // 终端输出的只有初始启动信息。 webpack 的警告和错误是不输出到终端的 quiet: true }, module: { //处理模块的规则(可在此处使用不同的loader来处理模块!) rules: [ //使用vue-loader处理以vue结尾的文件! { test: /\.vue$/, loader: "vue-loader", options: devConfig.vueloaderConf }, //使用vue-style-loader!css-loader!postcss-loader处理以css结尾的文件! { test: /\.css$/, use: [ "vue-style-loader", { loader: "css-loader", options: { sourceMap: true } }, { loader: "postcss-loader", options: { sourceMap: true } } ] }, //使用vue-style-loader!css-loader!postcss-loader处理以less结尾的文件! { test: /\.less$/, use: [ "vue-style-loader", { loader: "css-loader", options: { sourceMap: true } }, { loader: "less-loader", options: { sourceMap: true } }, { loader: "postcss-loader", options: { sourceMap: true } } ] } ] }, plugins: [ //开启HMR(热替换功能,替换更新部分,不重载页面!) new webpack.HotModuleReplacementPlugin(), //显示模块相对路径 new webpack.NamedModulesPlugin(), //编译出错时,该插件可跳过输出,确保输出资源不会包含错误! // new webpack.NoEmitOnErrorsPlugin(), //配置html入口信息 new HtmlWebpackPlugin({ title: "hello,xc-cli!", filename: "index.html", template: "index.html", //js资源插入位置,true表示插入到body元素底部 inject: true }), //编译提示插件 new FriendlyErrorsPlugin({ //编译成功提示! compilationSuccessInfo: { messages: [ `Your application is running here: http://${devConfig.host}:${devConfig.port}` ] }, //编译出错! onErrors: function(severity, errors) { if (severity !== "error") { return; } const error = errors[0]; const filename = error.file.split("!").pop(); //编译出错时,右下角弹出错误提示! notifier.notify({ title: "xc-cli", message: severity + ": " + error.name, subtitle: filename || "", icon: path.join(__dirname, "xc-cli.png") }); } }) ] }); module.exports = devConf;
8.3 透過建立以上檔案,並下載對應的依賴與建立專案入口,我們就可以透過npm run dev在本地開發vue專案啦! ! !
9.建立build/webpack.prod.conf.js
9.1 此檔案主要用於建立生產環境的設定.
9.2
"use strict"; //引入node path路径模块 const path = require("path"); //引入webpack const webpack = require("webpack"); //一个webpack配置合并模块,可简单的理解为与Object.assign()功能类似! const merge = require("webpack-merge"); //引入webpack生产环境配置参数 const prodConfig = require("../config").build; //引入webpack基本配置 const baseConf = require("./webpack.base.conf"); //一个创建html入口文件的webpack插件! const HtmlWebpackPlugin = require("html-webpack-plugin"); //一个抽离出css的webpack插件! const ExtractTextPlugin = require("extract-text-webpack-plugin"); //一个压缩css的webpack插件! const OptimizeCSSPlugin = require("optimize-css-assets-webpack-plugin"); //一个拷贝文件的webpack插件! const CopyWebpackPlugin = require("copy-webpack-plugin"); //资源路径 function assetsPath(_path) { return path.join(prodConfig.staticPath, _path); } //将webpack基本配置与生产环境配置合并! const prodConf = merge(baseConf, { //项目出口配置 output: { //Build后所有文件存放的位置 path: path.resolve(__dirname, "../public"), //html引用资源路径,可在此配置cdn引用地址! publicPath: prodConfig.publicPath, //文件名 filename: assetsPath("js/[name].[chunkhash].js"), //用于打包require.ensure(代码分割)方法中引入的模块 chunkFilename: assetsPath("js/[name].[chunkhash].js") }, //生成sourceMaps(方便调试) devtool: prodConfig.devtoolType, module: { //处理模块的规则(可在此处使用不同的loader来处理模块!) rules: [ //使用vue-loader处理以vue结尾的文件! { test: /\.vue$/, loader: "vue-loader", options: prodConfig.vueloaderConf }, { test: /\.css$/, use: ExtractTextPlugin.extract({ use: ["css-loader", "postcss-loader"], fallback: "vue-style-loader" }) }, { test: /\.less$/, use: ExtractTextPlugin.extract({ use: ["css-loader", "less-loader", "postcss-loader"], fallback: "vue-style-loader" }) } ] }, plugins: [ //每个chunk头部添加hey,xc-cli! new webpack.BannerPlugin("hey,xc-cli"), //压缩js new webpack.optimize.UglifyJsPlugin({ parallel: true, compress: { warnings: false } }), //分离入口引用的css,不内嵌到js bundle中! new ExtractTextPlugin({ filename: assetsPath("css/[name].[contenthash].css"), allChunks: false }), //压缩css new OptimizeCSSPlugin(), //根据模块相对路径生成四位数hash值作为模块id new webpack.HashedModuleIdsPlugin(), //作用域提升,提升代码在浏览器执行速度 new webpack.optimize.ModuleConcatenationPlugin(), //抽离公共模块,合成一个chunk,在最开始加载一次,便缓存使用,用于提升速度! // 1. 第三方库chunk new webpack.optimize.CommonsChunkPlugin({ name: "vendor", minChunks: function(module) { //在node_modules的js文件! return ( module.resource && /\.js$/.test(module.resource) && module.resource.indexOf(path.join(__dirname, "../node_modules")) === 0 ); } }), // 2. 缓存chunk new webpack.optimize.CommonsChunkPlugin({ name: "manifest", minChunks: Infinity }), // 3.异步 公共chunk new webpack.optimize.CommonsChunkPlugin({ name: "app", children: true, // (选择所有被选 chunks 的子 chunks) async: true, // (创建一个异步 公共chunk) minChunks: 3 // (在提取之前需要至少三个子 chunk 共享这个模块) }), //将整个文件复制到构建输出指定目录下 new CopyWebpackPlugin([ { from: path.resolve(__dirname, "../static"), to: prodConfig.staticPath, ignore: [".*"] } ]), //生成html new HtmlWebpackPlugin({ filename: path.resolve(__dirname, "../public/index.html"), template: "index.html", favicon: path.resolve(__dirname, "../favicon.ico"), //js资源插入位置,true表示插入到body元素底部 inject: true, //压缩配置 minify: { //删除Html注释 removeComments: true, //去除空格 collapseWhitespace: true, //去除属性引号 removeAttributeQuotes: true }, //根据依赖引入chunk chunksSortMode: "dependency" }) ] }); module.exports = prodConf;
十. 建立build/build.js
10.1 此檔案是專案打包服務,用來建構一個全量壓縮套件
10.2
"use strict"; //node for loading const ora = require("ora"); // rm-rf for node const rm = require("rimraf"); //console for node const chalk = require("chalk"); //path for node const path = require("path"); //webpack const webpack = require("webpack"); //webpack production setting const config = require("./webpack.prod.conf"); //指定删除的文件 const rmFile = path.resolve(__dirname, "../public/static"); //build start loading const spinner = ora("building for production..."); spinner.start(); //构建全量压缩包! rm(rmFile, function(err) { if (err) throw err; webpack(config, function(err, stats) { spinner.stop(); if (err) throw err; process.stdout.write( stats.toString({ colors: true, modules: false, children: false, chunks: false, chunkModules: false }) + "\n\n" ); if (stats.hasErrors()) { console.log(chalk.red(" Build failed with errors.\n")); process.exit(1); } console.log(chalk.cyan(" Build complete.\n")); console.log( chalk.yellow( " Tip: built files are meant to be served over an HTTP server.\n" + " Opening index.html over file:// won't work.\n" ) ); }); });
10.3 建立好以上檔案我們就可以透過npm run build來打包我們的專案文件並部署上線啦。
十一.大功告成!
透過以上步驟,一個spa版的vue鷹架就大功告成啦!
如果對一些細節不懂的可以留言或者上我的github查看
地址:https://github.com/webfansplz/xc-cli.git (本地下載)
上面是我整理給大家的,希望今後對大家有幫助。
相關文章:
#以上是利用webpack搭建vue腳手架的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript核心數據類型在瀏覽器和Node.js中一致,但處理方式和額外類型有所不同。 1)全局對像在瀏覽器中為window,在Node.js中為global。 2)Node.js獨有Buffer對象,用於處理二進制數據。 3)性能和時間處理在兩者間也有差異,需根據環境調整代碼。

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

SublimeText3 Linux新版
SublimeText3 Linux最新版

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中