最初に、フロントエンド プロジェクトは非常に単純です。html を外部に配置し、新しい css と js フォルダーを作成します。
時間が経ちプロジェクトが大きくなるにつれて、次の問題が次々と現れ始めました:
関連する人気のあるフレームワークには、grunt、gulp、webpack、bower などが含まれます。
ドキュメントを読む意欲のある人は、すでにこれらの新しいガジェットを使用し、多くのフロントエンドの問題を解決しています。
多くのツールがありますが、多くの新しいチームにとって、プロジェクトを完璧に計画する方法は依然としてハードルです。
彼らは、これらのツールをいつどのように使用すればよいのか知りません。フロントエンド プロジェクトの設計は非常に恣意的なものになる可能性があり、このランダム性が多くの人を選択の際に混乱させる原因となっています。
この記事では、フロントエンド プロジェクトを再構築する際に役立つことを願って、完璧なフロントエンド プロジェクトの構造計画計画を提供します。
計画計画は、ファイルの配置方法とファイルの名前の付け方を定義するだけではなく、さらに重要なことに、ツールのサポートがなければ、すべての計画が無意味になります。
フロントエンドプロジェクトの構造
根目录 |- assets: 存放所有js和css等,这些资源可能发布到 CDN | |- images: 存放所有 CSS 样式需要的背景图片<br /> | |- fonts: 存放所有 CSS 样式需要的字体 | |- styles: 存放所有CSS<br /> | | |- common: 存放公共的 CSS 代码 | |- scripts: 存放所有 JS<br /> | | |- common: 存放公共的 JS 代码 |- include: 存放所有公共的 HTML 头尾片段 |- images: 存放前景图片和flash |- libs: 存放前端所需的第三方类库 |- views: 如果使用了后端 MVC 框架,则页面放在这里。 |- _my: 存放开发者自己需要的文件,这个文件夹应该被 GIT 和 SVN 忽略掉。 |- page1.html 存放最终的前端页面,如果使用了 MVC 框架则不需要。
HTMLドキュメントの構造
<!DOCTYPE html><html><head> <meta charset="utf-8" /> <title>标题</title> <!-- #include virtual="/include/header.inc" --> <link rel="stylesheet" type="text/css" href="assets/styles/common/blog.css" /> <link rel="stylesheet" type="text/css" href="assets/styles/page2.css" /></head><body> <!-- #include virtual="/include/body.inc" --> 内容 <!-- #include virtual="/include/footer.inc" --> <script type="text/javascript" src="assets/scripts/common/blog.js"></script> <script type="text/javascript" src="assets/scripts/page2.js"></script> <!-- #include virtual="/include/stat.inc" --></body></html>
/include/header.inc:
<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" /> <meta name="viewport" content="width=device-width, initial-scale=1, minimal-ui, maximum-scale=1, user-scalable=no" /> <meta name="apple-itunes-app" content="app-id, app-argument="> <meta name="description" content="" /> <meta name="keywords" content="" /> <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="" /> <link rel="shortcut icon" href="favicon.ico" /> <link rel="apple-touch-icon" href="favicon.png"> <link rel="stylesheet" type="text/css" href="../assets/styles/common/common.css" />
/include/body.inc:
<!--[if lt IE 9]><div role="alert">你的浏览器实在<strong>太太太太太太旧了</strong>,放学别走,升级完浏览器再说 <a target="_blank" class="alert-link" href="http://browsehappy.com">立即升级</a></div><![endif]-->
/include/footer.inc:
<div>版权所有 @copy; 2015 xuld</div><script type="text/javascript" src="assets/scripts/common/common.js"></script>
/include/stat.inc:
<!-- 在这里添加网站统计代码 --><br />
その他のファイル
Web サイトに複数の異なる著作権表示が必要な場合は、footer-full.inc と footer-simple.inc をそれぞれ 1 つ作成し、footer-common.inc を公開します。
静的リソース参照
1.less/sass/coffee ファイルをコンパイルし、対応する css/js ファイルに変換します。
2. HTML ファイル内のリソース参照アドレスを更新し、生成された css/js ファイルを参照します。
3. これらのリソース ファイルの参照アドレスにタイムスタンプを追加します。
4. プロジェクトが CDN を使用している場合、公開ツールはファイルを CDN に自動的にアップロードし、ファイル内のパスを CDN アドレスに変更する必要があります。
公開前:
<link rel="stylesheet" type="text/css" href="../assets/styles/page1.less" />
公開後:
<link rel="stylesheet" type="text/css" href="http://cdn.com/project/assets/styles/page1.css?_=md5" />
タイムスタンプの問題
パスに ?_=md5 を追加します
スクリプトとスタイル
css と js を同じ担当者が担当する場合は、styles フォルダーと scripts フォルダーを区別せず、assets ディレクトリに直接配置することをお勧めします。
同じ人が HTML をバックエンド コードに変換する場合は、ページに CSS と JS を直接記述することをお勧めします。公開ツールはそれを抽出する責任があります:
<style __dest="assets/styles/page1.css"> /* CSS 代码 */</style>
パブリック コードの依存関係
サイト全体に共通の js: common/common.js
个别页面可以引入一些外部的js和css,比如 editor.js 这种比较大的文件。但原则上每个文件最多只能引 5个js和5个css。需要引的文件多时则需要打包合并。
出于性能考虑,有时候可以将页面私有的js和css直接内联到页面。
<script src="assets/page1.js?__inline"></script>
所有可复用组件、第三方框架都放在 libs,libs 文件发布时会被忽略掉,项目里也不能直接引用 libs 下的代码。
如果需要引用一个组件,有三种方案:
如果项目较小,并不需要太大模块化东西,直接使用文件包含是最方便的:
common.js
// #include /libs/3rdlibs/jquery-2.1.0.js// #include /libs/3rdlibs/jquery.mobile.js<br /><br /><br />// 其它项目需要的公共代码
发布工具会处理 #include 。
var $ = require('libs/3rdlibs/jquery');
发布后,CommonJs 模块会被转换为标准的 AMD 模块。
假设一个页面需要引用 common.js 和 page1.js ,而这2个js又分别引用了 libs 下的若干个组件(可能有重复)
那么 page1.js 可以添加如下指令排除掉 common.js 所引入的文件
// #exclude common.jsvar $ = require('libs/3rdlibs/jquery');
最后生成的代码,page1.js 将包含所有所需的模块,并删除了 common.js 包含的模块。
以上所介绍的代码方案是不能直接在浏览器运行的,这里有三个方案可以实现本文所描述的各个功能:
对应经常切页面的哥们,占位图是非常有用的。
<img src="@100x100.jpg">
writeJsonp({ a: 1});
本文所描述的是一种建议的做法,也是一个发布工具所需要提供的功能。每个团队可以针对自己的需求做一些个别的定制。本文所提到的示例都是以 tpack 为原型书写的。不同的工具会有稍微不同的写法。但是其解决的问题是一样的。